【问题标题】:dicts are not orderable in python 3?dicts 在 python 3 中不可排序?
【发布时间】:2014-04-15 12:24:47
【问题描述】:

为什么 dicts 在 python2 中是可排序的,而在 python3 中是不可排序的?我在文档中的任何地方都找不到它。

Python 3.3.4 (default, Feb 11 2014, 16:14:21)
>>> sorted([{'a':'a'},{'b':'b'}])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: dict() < dict()

对比

Python 2.7.6 (default, Feb 26 2014, 12:01:28)
>>> sorted([{'a':'a'},{'b':'b'}])
[{'a': 'a'}, {'b': 'b'}

【问题讨论】:

  • 不,您希望它们按什么顺序排列?
  • 嗯,我错了,key和value都用了;不过,由于字典本身是无序的,这实际上并没有多大意义。
  • 为什么在 Python 3 中被放弃了?它是否在某处的某些文档中找到?
  • 但是甚至没有记录顺序,并且在所有用例中都没有意义。显式优于隐式;您需要对字典进行排序,您需要自己定义正确的顺序应该是什么。

标签: python sorting python-3.x dictionary python-2.x


【解决方案1】:

您需要 sortkey (documentation)。只有你知道你想要什么键,但这里有一个例子:

>>> dicts = [{'a':'a'},{'b':'b'}]
>>> sorted(dicts, key=lambda x:sorted(x.keys()))
[{'a': 'a'}, {'b': 'b'}]

这是按键排序,其中“最低”键的字典排在第一位


编辑: 正如 Martijn Pieters 所指出的,this answer 准确描述了 Python 2 是如何做到的。但是您应该按照对您的情况有意义的方式进行排序,这可能与 Python 2 的做法有根本的不同。

【讨论】:

  • 这几乎是 Python 2 所做的,除了它还比较键是否相等时的值。
  • 我在 comment under the question 中链接到 Ned 的详细描述。
【解决方案2】:

Python 2 使用undocumented ordering,实现为.__cmp__() 特殊方法。

排序仅在有限的用例中有意义,并且仅在 Python 2 试图使 一切 可排序时才存在。

Python 3 drastically cleaned up Python's ordering story; .__cmp__() 消失了,只有实际上具有自然排序的类型(例如数字和字符串)现在支持排序。对于其他所有内容,您需要明确定义排序。

字典没有自然排序。如果您确实需要对字典进行排序,则需要定义一个对您的用例有意义的显式顺序。如果这意味着只比较密钥,请这样做(例如使用key=sorted)等。

【讨论】:

  • 但是为什么在 python 3 中我可以对集合列表进行排序?如果我做 a = {1, 2}, b = {3, 4} 我可以做 sorted([a, b]) 和 sorted([b, a]),但是 sorted([a, b]) !=排序([b,a])。这似乎使用 len 运算符作为键,但为什么不抛出 TypeError 呢?
  • @Erotemic 设置重载比较运算符以实现子集测试。如果 a 是 b 的严格子集,a &lt; b 为真。
  • @Erotemic 他们没有定义排序顺序; {1, 2, 3} 是集合 {1}{2}{3} 的超集,但是这三个较小的集合不是彼此的子集,因此 &lt; 对于这些较小集合的任何组合都返回 false。这打破了对排序的期望。然而,没有类型错误被抛出,因为它仍然是一个合法的测试。
猜你喜欢
  • 1970-01-01
  • 2019-08-28
  • 2017-12-27
  • 2018-07-12
  • 1970-01-01
  • 2021-01-25
  • 2018-07-10
  • 1970-01-01
相关资源
最近更新 更多