2017-03-04 88 views
5

我剛剛從python 3開始幾天前。雖然節目,我遇到奇怪的情況Python找不到的類型:NoneType()> int()當找到列表的最大值時

a = [ 
    [5, [[1, 1, None], [None, None, None], [None, None, None]]], 
    [5, [[1, None, 1], [None, None, None], [None, None, None]]] 
    ] 

max(a)來給我

Traceback (most recent call last): File "", line 1, in TypeError: unorderable types: NoneType() > int()

但如果我嘗試

a = [ 
    [5, [[1, 1, None], [None, None, None], [None, None, None]]], 
    [5.1, [[1, None, 1], [None, None, None], [None, None, None]]] 
    ] 

max(a)顯示

[5.1, [[1, None, 1], [None, None, None], [None, None, None]]] 

此行爲的任何特定原因?

更新1: 我嘗試不同的東西

a = [[5, [[1,2], [3,4]]],[5,[[3,4],[5,10]]],[5,[[5,6],[7,8]]]] 

max(a)[5, [[5, 6], [7, 8]]] 我的疑問是,爲什麼錯誤不是在這種情況下顯示?

+1

哪個部分你困惑?如果列表中的第一個元素不相等,則不需要與第二個元素相關聯。 – jonrsharpe

+0

downvote的任何特定原因? –

+0

@jonrsharpe:好的..我的疑問是爲什麼python向我展示錯誤? 對於'''[[5- [[1,2],[3,4]]],[5,[3,4],[5,6]]],[5,[[5,6- ],[7,8]]]] '''的輸出爲'''[5,[5,6],[7,8]]]'''和爲什麼相同的錯誤沒有顯示? –

回答

6

這是因爲max做到這一點,當它遇到無值:

max([1, None]) 

也給出了同樣的錯誤:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-14-c33cf47436bc> in <module>() 
----> 1 max([1,None]) 

TypeError: unorderable types: NoneType() > int() 

基本上最大的努力來遍歷目錄,找出較大值第一。但是當它達到None時,它不能再比較那麼拋出錯誤。

a = [ 
    [5, [[1, 1, None], [None, None, None], [None, None, None]]], 
    [5.1, [[1, None, 1], [None, None, None], [None, None, None]]] 
    ] 

它比較5和5.1,並認爲與5.1更大的列表。

雖然當兩個第一個值都是5時,它會迭代下一個項目並碰到導致錯誤的None

更新:

這個例子可能有助於澄清更好的錯誤消息:

max([1,'2']) 

錯誤:

TypeError: unorderable types: str() > int() 

基本上它試圖比較'2' with 1,給TypeError: unorderable types: str() > int()

早些時候我們合作過我們得到的錯誤信息是TypeError: unorderable types: NoneType() > int()

+0

感謝您澄清疑問。 –

+0

@curious_coder歡迎:) –

3

在Python 2中,這個None比較低的任何整數在某些情況下是有用的,當你需要一個你無法預測的最小值時(因爲整數沒有像C中那樣固定的最小/最大值)。

在Python 3,這是不可能的了(而且大部分是最好的時候,它像"2"和3例如比較字符串爲整數時,節省了許多煩惱。

如果你真的需要這一點,我想到了一個變通的

你可以定義一個類,這是比任何其他對象低,使用類的一個實例,而不是None

class AM: 
    def __int__(self): 
     return 0 
    def __gt__(self,other): 
     return False 
    def __repr__(self): 
     return "INF" # prints out nicely 

always_min = AM() 

a = [ 
    [5, [[1, 1, always_min], [always_min, always_min, always_min]]], 
    [5, [[1, always_min, 1], [always_min, always_min, always_min]]] 
    ] 

print(max(a)) 

我得到:

[5, [[1, 1, INF], [INF, INF, INF]]] 

這證明了搶七工作。

注意,這是一個最小的實現。 max只使用>:只定義__gt__很懶,我們需要定義其他__ge____le____lt__因此對於一般用途。