python如何对字典列表进行排序?

时间:2013-04-12 15:21:35

标签: python sorting

使用sorted内置函数而不提供任何可选参数,python如何对字典列表进行排序?

2 个答案:

答案 0 :(得分:8)

Python 2确实试图提供一个排序(它对所有类型都这样做),首先是基于长度(首先是shortts dicts),如果长度相等则是按键(一个较小的键去首先),然后如果所有的键都相等,那么就是值(较小的值先行);请参阅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中,它根本不对它们进行排序;排序dicts真的没有意义:

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

请参阅Python 3文档中的新内容的Ordering Comparisons section

答案 1 :(得分: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()

没有合理的默认值来指定dicts的顺序,因此dicts是不可订的。

此行为已从python2更改,因为python3中的比较已被重写。之前可以使用cmp()比较几乎所有内容,这反映在列表的排序中。 python3解决了这个问题,cmp()不存在,并且使用rich comparision方法完成了比较,只做了与实际相似的东西,或cmp(Exception(), 42)之类的东西有多大意义?