使用sorted
内置函数而不提供任何可选参数,python如何对字典列表进行排序?
答案 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)
之类的东西有多大意义?