2014-04-11 19 views
2

我正在爲我的介紹級別CS類工作,我不確定如何解決此任務。這裏是:命令行輸入,極端和地圖模式python

創建一個程序,其中需要命令行輸入來獲取數據和 使用列表處理數據。下面是該程序應如何響應:

[email protected]:~/cs150/loops$ python3 command.py 11 5 3 51 
the smallest number is 3 

要將參數轉換爲整數,使用地圖的圖案,如:在List.py

strings = ArrayToList(sys.argv[1:]) 
numbers = ListMap(int,strings) 

該列表地圖功能,爲你定義了,你

wget troll.cs.ua.edu/cs150/book/List.py 

您需要導入您的程序列表和sys模塊: 可以下載

import sys 
from List import * 

最後,使用列表中的極端模式來查找和打印 最小整數一旦列表地圖已轉換的參數字符串轉換爲整數 。

以下是我有:

import sys 
from List import * 

def main(): 
    strings = ArrayToList(sys.argv[1:]) 
    numbers = ListMap(int,strings) 
    smallest = numbers[0] 
    for i in range(0,len(numbers),1): 
     if (numbers[i] < smallest): 
     smallest = numbers[i] 
    print("The smallest number is: ", smallest) 
main() 

下面是我從這個代碼收到錯誤消息:

File "command.py", line 12, in <module> 
    main() 
File "command.py", line 9, in main 
    if (numbers[i] < smallest): 
TypeError: unorderable types: list() < int() 

很抱歉,這是這麼長的帖子,我真的很需要一些幫助因爲我是編碼新手,我想徹底。不知道我出錯的地方或我需要添加/更改的地方,任何幫助將不勝感激。提前致謝。

+0

'ListMap'包含'int'和'list'元素嗎?在if語句之前,嘗試在你的循環中打印每個'numbers [i]'。同時打印'type(numbers [i])',以便知道它們的類型。用打印的內容更新你的問題會有所幫助。 –

+0

Python中不需要'range(0,len(numbers))'。只是'數字編號'。吉茲,你甚至不必要地指定了1步! :P –

回答

2

你的列表的內部表示,其實名單的列表,看起來像這樣:['4', ['2', ['5', ['1', ['0', None]]]]]。您應該使用從List.py模塊headtail函數來獲取列表的第一個元素:

while numbers: 
    num, numbers = head(numbers), tail(numbers) 
    if num < smallest: 
     smallest = num 

注意,鑑於此實現列表,遞歸執行可能會更自然:

def get_smallest(lst): 
    h, t = head(lst), tail(lst) 
    return min(h, get_smallest(t)) if t else h 
smallest = get_smallest(numbers) 
+1

這是正確的。從本質上講,教師不是一個Python程序員,並且在一個非常混亂的模塊中進行功能性編程,其中有很多被覆蓋的內置東西,以及一些明顯錯誤的東西(比如'!= None')。因爲他試圖複製curried函數,所以最好只使用他的東西,因爲除非你真的知道你在做什麼,否則它不會和普通的Python工具兼容。 –

0

您不必手動搜索的最小值,你可以這樣做:

smallest = sorted(numbers)[0] 

我不知道該numbers類型是什麼,但如果其List這會工作。否則,您可以指定這樣的排序鍵:

smallest = sorted(numbers, key=some_key)[0] 

key是元素的比較的方法。

+0

你甚至不需要那樣做。你可以使用'min'。 –

1

很遺憾,你必須使用你的教師奇怪的拼寫函數(根據Python中無處不在的PEP8 Style Guide,函數應該是小寫)。

你可以在3線的Python 3的完成這整個分配:

# command.py 
import sys 
if __name__ == '__main__': 
    print(min(map(int, sys.argv[1:])))