2013-04-12 123 views
0

使用sorted內置函數而不提供任何可選參數,python如何對字典列表進行排序?python如何對字典列表進行排序?

+3

請參閱http://stackoverflow.com/questions/3484293/is-there-a-description-of-how-cmp-works-for-dict-objects-in-python-2 –

回答

8

Python 2中確實試圖提供一種排序(它這樣做對於所有類型),第一基於長度(第一短路類型的字典)中,如果長度是由密鑰相等,則(一個較小的鍵,可進入第一),然後如果所有的鍵都相等,那麼打開值(較小的值首先出現);請參閱dictobject.c源代碼中的characterize and dict_compare functions

簡短演示:

>>> sorted([{1:2}, {}]) 
[{}, {1: 2}] 
>>> sorted([{1:2}, {0:1}]) 
[{0: 1}, {1: 2}] 
>>> sorted([{1:2}, {1:1}]) 
[{1: 1}, {1: 2}] 

在Python 3,這並不在他們的所有排序;排序類型的字典實在是沒有意義的:

>>> sorted([{}, {}]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unorderable types: dict() < dict() 

看到什麼新的Ordering Comparisons section在Python 3文檔。

+0

如何在「dict」中使鍵相等?如果等於你的意思是不同的'type',那麼我猜它會比較鍵的類型,而不是它們的值。 因此,'int'小於'str','str'小於'tuple'。 –

+0

@AshwiniChaudhary:如果unicode的鍵具有相同的ascii值,則等於'str'鍵。 'int'鍵不能等於'str'鍵,但是它們*可以等於'float'鍵。但是你可以使用相同的鍵定義一個字典(所有鍵都相等),然後比較值。 –

+0

啊!我的壞,一時之間,我認爲我們正在整理一個單一的字典,而不是排序列表的字典。 –

1

它不會(至少python3):

>>> x = [{4:1}, {3:2}, {1:2}, {5:6}] 
>>> x 
[{4: 1}, {3: 2}, {1: 2}, {5: 6}] 
>>> sorted(x) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unorderable types: dict() < dict() 

沒有指定類型的字典的順序合理的默認值,這樣類型的字典是unorderable。

此行爲已從python2更改,因爲比較已在python3中重新編制。在可以比較幾乎所有使用cmp()的東西之前,這反映了列表的排序。 python3修復了這個問題,cmp()不存在,並且使用rich comparision方法完成比較,只能做出與真實情況相媲美的事情,或者像cmp(Exception(), 42)這樣的事情有多大意義?

+0

對於py3x是正確的,不適用於py2x。 –

+0

沒有嘗試python2 :) – mata

相關問題