Mat*_*elk 5 python sorting dictionary python-2.x python-3.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 types: dict() < dict()
Run Code Online (Sandbox Code Playgroud)
与
Python 2.7.6 (default, Feb 26 2014, 12:01:28)
>>> sorted([{'a':'a'},{'b':'b'}])
[{'a': 'a'}, {'b': 'b'}
Run Code Online (Sandbox Code Playgroud)
Python 2使用未记录的顺序,作为.__cmp__()特殊方法实现.
排序只在一组有限的用例中才有意义,并且只存在,因为Python 2试图使所有东西都可以订购.
Python 3 彻底清理了Python的订购故事 ; .__cmp__()已经消失,只有实际具有自然排序的类型(例如数字和字符串)现在支持排序.对于其他一切,您需要明确定义排序.
字典没有自然的顺序.如果您确实需要订购字典,则需要定义一个对您的用例有意义的显式顺序.如果这意味着只比较键,那么这样做(例如使用key=sorted)等.
你需要sort一个key(文档).只有你知道你想要什么键,但这里有一个例子:
>>> dicts = [{'a':'a'},{'b':'b'}]
>>> sorted(dicts, key=lambda x:sorted(x.keys()))
[{'a': 'a'}, {'b': 'b'}]
Run Code Online (Sandbox Code Playgroud)
这是按键排序,其中带有"最低"键的字典首先出现
编辑:正如Martijn Pieters所指出的,这个答案准确地描述了Python 2是如何做到的.但是你应该按照对你的情况有意义的方式进行排序,这可能与Python 2的工作方式有根本的不同.