在不提供任何可选参数的情况下使用sorted
内置函数,python 如何对字典列表进行排序?
问问题
1526 次
2 回答
8
Python 2 确实尝试提供排序(它对所有类型都这样做),首先基于长度(首先是短的 dicts),如果长度相等,然后通过键(较小的键首先出现),然后如果所有键都相等,那么关于值(较小的值先出现);请参阅源代码中的characterize
和dict_compare
函数。dictobject.c
简短演示:
>>> 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 中的新增功能文档的排序比较部分。
于 2013-04-12T15:27:39.830 回答
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()
不存在,并且使用丰富的比较方法进行比较,这只能使真正具有可比性的东西,或者像这样的东西有多大意义cmp(Exception(), 42)
?
于 2013-04-12T15:23:40.983 回答