【问题标题】:How does python sort a list of dictionaries?python如何对字典列表进行排序?
【发布时间】:2015-03-02 20:07:25
【问题描述】:

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

【问题讨论】:

标签: python sorting


【解决方案1】:

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。
  • @AshwiniChaudhary:unicode 键等于 str 键,如果它们具有相同的 ascii 值。 int 键永远不能等于str 键,但它们可以等于float 键。但是您可以使用相同的键(所有键相等)定义一个字典,然后比较值。
  • 啊!我的错,有一刻我以为我们正在对单个字典进行排序,而不是对字典列表进行排序。
【解决方案2】:

它没有(至少对于 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) 这样的东西有多大意义?

【讨论】:

  • 适用于 py3x,不适用于 py2x。
猜你喜欢
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 2016-06-11
  • 2011-12-22
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
相关资源
最近更新 更多