2013-04-12 127 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

相关问题