0

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

4

2 回答 2

8

Python 2 确实尝试提供排序(它对所有类型都这样做),首先基于长度(首先是短的 dicts),如果长度相等,然后通过键(较小的键首先出现),然后如果所有键都相等,那么关于值(较小的值先出现);请参阅源代码中的characterizedict_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 回答