如果你打印出什麼m
是內循環,這將成爲很明顯的。或者你可能想用interactive visualizer或只是調試器來測試它。
假設您的值爲2, 4, 6, 8, 10, 12, 14, 16, 18, 20
。排序後,你有:
m = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
n = max(m) = 20
n = int(n) = 20
這max
是沒用的,因爲排序是必須在列表中的最後一個值的定義(你似乎是依靠在你的循環反正) 。
而且int
是一種誤導,它使它看起來像你的代碼將工作,即使數字是字符串而非數字,但它實際上不會,因爲sorted
(和max
)將把'10'
小於'2'
,等等。
但這些都不是你的大問題。因爲你的第一個n
甚至,你將進入循環,在循環的第一件事情是這樣的:
m=[m[:-1]]
...這將做到這一點:
m = [[2, 4, 6, 8, 10, 12, 14, 16, 18]]
所以,接下來的兩行這樣做:
n = [2, 4, 6, 8, 10, 12, 14, 16, 18] # the max of a 1-element list is that element
n = int([2, 4, 6, 8, 10, 12, 14, 16, 18])
和繁榮,這是你的例外。
如果您想將m
設置爲m
的最後一個元素,請執行m = m[:-1]
。圍繞它投擲那些額外的括號將m
設置爲由一個元素組成的list
,該元素本身是除m
的最後一個元素之外的所有元素組成的列表。
請注意,儘管你在描述中說了什麼,「我輸入包含奇數的變量,它給了我正確的答案」,但事實並非如此。它只適用於你的最大值是奇數的情況,所以你從不首先進入循環。
修復此問題後,您的代碼實際上仍然中斷,但希望現在您知道如何自己調試此代碼。
同時,解決這個問題的pythonic方法是嘗試將高級英語描述直接轉換爲高級Python。我們如何找到m
的最高奇數?
首先得到奇數號碼m
:
odds = (n for n in m if n % 2)
(如果您創建一個odd
功能,如果你,你可能更喜歡filter
到發電機表達可能是更具可讀性。)
然後,以獲得最大的:
max_odd = max(odds)
當然,你需要處理在沒有勝算的情況。你可以通過檢查if odd:
來做到這一點。但蟒蛇,它通常是更好地請求原諒比許可,所以,這裏是你的整個程序:與m=[m[::-1]]
發生
m = [a, b, c, d, e, f, g, h, j, k]
odds = (n for n in m if n % 2)
try:
print max(odds), 'is the largest odd number'
except ValueError:
print 'There are no odd numbers'
什麼了''的值,'B','C ','d','e','f','g','h','j'和'k'?另外,考慮到你正在排序列表,這個算法似乎不必要的複雜。 – 2013-03-25 21:01:28
嘗試在循環中每次打印'm'和'n'的值;它應該可以幫助你看到你的錯誤在哪裏。也就是說,這是一種遍歷值列表的非正統方法。 – chepner 2013-03-25 21:10:51