2016-01-26 110 views
0
[1,3] > [1,2] 
True 

好的,聽起來很合理,如果沒有其他的話,就直觀一些。Python中的字符串,列表和元組如何按元素進行比較?

(3,2) <= (3,2) 
True 

同上。

但令:

(4,3) >= (1,1,1) 
True 

如果我們在這裏比較values()

{'a':1, 'b':2} < {'a':1, 'b':3} 
True 

那爲什麼我們比較keys()這裏:

{'a':1, 'b':2} < {'x':1, 'y':2} 
True 

我沒有找到有關這些現象的文件。

+2

指示不是序列。不要比較它們。在Python 2中,它會進行排序工作,產生大部分一致但毫無意義的結果。在Python 3中,它會引發TypeError。 – user2357112

+0

另外,不要妄下結論。在任何一個例子中,字典比較邏輯都不會比較'keys()'或'values()'。 – user2357112

+0

@ user2357112我知道有人會在我的結論跳躍中給我打電話。好。現在解釋**正在發生什麼,如果它不是要比較的鍵和值。 – Pyderman

回答

4

(4,3)大於(1,1,1)的原因完全相同,因爲"mouse"大於"elephant"Lexicographical order。對於字符串,您可能非常熟悉它。你會期望「大象」出現在字典中的「鼠標」之前,對嗎?

+0

有趣的是,我最近發佈了一個問題,'爲什麼123 <'foo'?',並被及時告知'因爲Guido如此說'。 – Pyderman

+0

@Pyderman我想我刪除了,而你鍵入:-)(我真的沒有什麼可以說關於字典) –

4

所有這些都非常清楚地記錄在Python Language Reference 5.9 Comparisons

特別:

  • 元組和列表字典順序使用相應的元件的比較比較。這意味着爲了比較相等,每個元素必須相等並且這兩個序列必須是相同的類型並具有相同的長度。 如果不相等,序列的順序與它們的第一個不同元素相同。例如,cmp([1,2,x], [1,2,y])返回與cmp(x,y)相同的
    。如果相應元素不存在,則首先排序較短的序列(例如,[1,2] < [1,2,3])。
  • 映射(字典)比較相等當且僅當它們的排序(key, value)列表比較相等。 [1]除了平等之外的結果
    一致解決,但沒有其他定義。 [2]

其中腳註是

  1. 實施有效地計算此,無需構建列表或分選。

  2. 早期版本的Python使用排序(鍵值)列表的字典對比,但這對於常見的比較相等的情況非常昂貴。甚至早期版本的Python 僅通過身份對字典進行了比較,但是這導致了意外 ,因爲人們希望能夠通過將其與{}進行比較來測試字典空虛 。


在Python 3比較字典引發TypeError。同樣,具有不相容元件的序列:

>>> {} < {1:2} 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unorderable types: dict() < dict() 
>>> ['a'] < [1] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unorderable types: str() < int() 
相關問題