2016-09-16 115 views
-4

當我運行以下混淆比較錯誤

def max(L): 
    m = L[0][0] 
    for item in L: 
     if item[0] > m: 
      m = item 
    return m 

L = [[20, 10], [10, 20], [30, 20],[12,16]] 
print(max(L)) 

我得到的錯誤 TypeError: unorderable types: int() > list()在第4行的混亂是當我試圖讓這兩個成員的len()。所以,從錯誤信息是合理的假設m是列表,所以我跑

def max(L): 
    m = L[0][0] 
    for item in L: 
     len(m) 
     if item[0] > m: 
      m = item 
    return m 

L = [[20, 10], [10, 20], [30, 20],[12,16]] 
print(max(L)) 

並且得到錯誤len(m) TypeError: object of type 'int' has no len()。好了,所以唯一的選擇就是item[0]是列表...所以同樣

def max(L): 
    m = L[0][0] 
    for item in L: 
     len(item[0]) 
     if item[0] > m: 
      m = item 
    return m 

L = [[20, 10], [10, 20], [30, 20],[12,16]] 
print(max(L)) 

,我也得到了同樣的錯誤:len(item[0]) TypeError: object of type 'int' has no len()。由於我確定你可以比較2個整數,所以我很難理解如何處理原來的錯誤。

+4

你認爲'len(m)'做什麼?它計算列表的長度......然後你完全忽略*。 – jonrsharpe

+0

?....它只是想看看我是否得到一個錯誤,因爲它不適用於數字數據類型,因此提供了混淆,爲什麼我得到錯誤,當編譯器指出存在1比較 – xor

+0

Python有一個高效的內置'max'功能,不需要編寫自己的。但是,如果你想爲自己的學習目的而自己寫,那麼給它一個不同的名字是個好主意。 –

回答

0

摩西Koledoye說,您獲得的TypeError: unorderable types: int() > list()錯誤,因爲在循環的第一指派指派了整個itemm,所以下次你試圖比較你的時間正在與整數item[0]比較列表m。所以你只需要分配item[0]m。就像這樣:

def max0(L): 
    m = L[0][0] 
    for item in L: 
     if item[0] > m: 
      m = item[0] 
    return m 

L = [[20, 10], [10, 20], [30, 20], [12, 16]] 
print(max0(L)) 

輸出

30 

但有一個更好的方式來做到這一點:使用內置max與從每個列表抓住的第一個元素序列中的關鍵作用你傳遞給最大值。

from operator import itemgetter 

L = [[20, 10], [10, 20], [30, 20], [12, 16]] 
m = max(L, key=itemgetter(0)) 
print(m) 

輸出

[30, 20] 

你也可以這樣做一個簡單的lambda功能,而不是導入itemgetter,但itemgetter是更有效的。

m = max(L, key=lambda u:u[0]) 

實際上,您並不需要在這裏提供一個關鍵函數,因爲Python會很樂意比較兩個列表(或元組)。它比較兩個列表中的相應元素,只要發現一對不相等的元素就停下來。所以[30, 20] > [30, 19]評估爲True[30, 20] > [29, 1000]也是如此。2個列表不必是相同的長度; [30, 20, 0] > [30, 20]評估爲True

所以,你可以只是做

m = max(L) 

但使用itemgetter是更好的(也可能是更高效的),因爲它明確地說,只有通過他們的第一個元素比較子列表。

+0

thx這麼多的幫助 – xor

2

在你循環的第一次迭代,做m = item使得m參考list這事後不能與下一次迭代的int(即item[0] > m)進行比較。

而應該分配mitem的元素之一,說m = item[0](找到在每個子列表中第一個元素最大),這取決於你想如何準確地計算你的最大值。

請注意,如果您要查找全球最大值,可以簡單地使用flatten列表,並使其更容易。