在Python3中dict是不可排序的吗?

在Python3中dict是不可排序的吗?,python,sorting,python-3.x,dictionary,python-2.x,Python,Sorting,Python 3.x,Dictionary,Python 2.x,为什么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

为什么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()

您需要使用
进行排序。只有你知道你想要什么钥匙,但这里有一个例子:

>>> dicts = [{'a':'a'},{'b':'b'}]
>>> sorted(dicts, key=lambda x:sorted(x.keys()))
[{'a': 'a'}, {'b': 'b'}]
这是按键排序,其中具有“最低”键的dict首先出现


Edit:正如Martijn Pieters所指出的,它准确地描述了Python 2是如何做到这一点的。但是您应该按照对您的情况有意义的方式进行排序,这可能与Python2的工作方式有根本的不同。

Python2使用一种特殊的方法实现

排序只在有限的用例集中才有意义,并且只存在于Python2试图使一切都可排序的情况下

Python 3<代码>。\uuu cmp\uuu()
已经消失,只有真正具有自然顺序的类型(如数字和字符串)现在才支持排序。对于其他所有内容,都需要显式定义排序


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

不,您希望它们的顺序是什么?Hrm,我错了,同时使用键和值;尽管如此,因为字典本身是无序的,这实际上没有多大意义?它在一些文档中的某个地方找到了吗?但是这个顺序甚至没有文档记录,并且在所有用例中都没有意义。外显优于内隐;你需要对字典进行排序你需要带上你自己的定义正确的顺序应该是什么。这与Python 2做的差不多,只是它还比较了键相等时的值。我在a中链接了Ned的详细描述。但是为什么在Python 3中我可以对集合列表进行排序?如果我做a={1,2},b={3,4},我可以做排序([a,b])和排序([b,a]),但排序([a,b])!=排序([b,a])。这看起来像是使用len操作符作为键,但为什么它不抛出一个TypeError呢?@Erotemic set重载比较操作符来实现子集测试<如果a是b的严格子集,则code>a
为真。@Erotemic它们不定义排序顺序
{1,2,3}
是集合
{1}
{2}
{3}
的超集,但这三个较小的集合不是彼此的子集,因此

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