Python 3中的字典不可排序吗?

5 投票
2 回答
6858 浏览
提问于 2025-04-17 21:50

为什么在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'}

2 个回答

9

你需要用一个 key 来进行 sort(排序),具体可以参考这个 文档。只有你知道你想要的关键字是什么,不过这里有一个例子:

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

这个例子是根据键来排序的,字典中“最小”的键会排在最前面。


补充:正如 Martijn Pieters 指出的那样,这个回答准确描述了 Python 2 是如何处理的。但是你应该根据 你的情况 来排序,这可能和 Python 2 的处理方式完全不同。

10

Python 2使用了一种未公开的排序方式,这个排序是通过一个叫做.__cmp__()的特殊方法来实现的。

这种排序方式只在一些特定的情况下有意义,而且之所以存在,是因为Python 2想要让几乎所有东西都可以排序。

而在Python 3中,对排序的处理进行了大幅度的简化.__cmp__()这个方法被去掉了,现在只有那些本身就有自然排序的类型(比如数字和字符串)才支持排序。对于其他类型,你需要自己明确地定义排序规则。

字典是没有自然排序的。如果你需要对字典进行排序,就必须定义一个适合你使用场景的明确排序方式。如果这意味着只比较键,那就这样做(例如,可以使用key=sorted),等等。

撰写回答