【发布时间】:2015-03-02 20:07:25
【问题描述】:
使用sorted内置函数不提供任何可选参数,python如何对字典列表进行排序?
【问题讨论】:
使用sorted内置函数不提供任何可选参数,python如何对字典列表进行排序?
【问题讨论】:
Python 2 确实尝试提供排序(它对 all 类型这样做),首先基于长度(首先是短的 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。
【讨论】:
dict 中的键如何相等?如果相等,您的意思是不同的type,那么我猜它会比较键的类型,而不是它们的值。所以,int 小于str 并且str 小于tuple。
unicode 键等于 str 键,如果它们具有相同的 ascii 值。 int 键永远不能等于str 键,但它们可以等于float 键。但是您可以使用相同的键(所有键相等)定义一个字典,然后比较值。
它没有(至少对于 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()
指定字典的顺序没有合理的默认值,因此字典是无序的。
此行为已从 python2 更改,因为比较已在 python3 中进行了重新设计。在可以使用cmp() 比较几乎任何东西之前,这反映在列表的排序上。 python3 解决了这个问题,cmp() 不存在,并且使用rich comparision 方法进行比较,这只能使真正具有可比性的东西,或者像cmp(Exception(), 42) 这样的东西有多大意义?
【讨论】: