从Python 3.6开始,Python中的字典就被排序
来自-https://stackoverflow.com/a/39980744/4647107
在Python 3.6+中是否订购了词典?
它们是插入命令。从Python 3.6开始,对于CPython Python的实现,字典记住项目的顺序 已插入。在Python 3.6中,这被视为实现细节。 如果要插入顺序,则需要使用OrderedDict 在其他Python实现中都得到保证。
从Python 3.7开始,这不再是实现细节,并且 而是成为一种语言功能。来自GvR的python-dev消息:
做到这一点。裁定“裁定保留插入顺序”。谢谢!
这只是意味着您可以依靠它。其他实现 如果他们希望,Python还必须提供一个插入顺序字典。 是Python 3.7的一致实现。
现在有没有办法在python中实现无序字典?
答案 0 :(得分:0)
您可以伪造它:
>>> import random
>>> d={'a':[1,2,3],'b':[4,5,6],'c':[7,8,9]}
>>> items=list(d.items())
>>> random.shuffle(items)
>>> dict(items)
{'c': [7, 8, 9], 'b': [4, 5, 6], 'a': [1, 2, 3]}
>>>
答案 1 :(得分:0)
使用sorted()
给出可预测的顺序:
_dict = sorted({'b': 1, 'a': 2})
正如一些人提到的那样,这有助于理解为什么,您想要一个无序的字典。我个人是在寻找无序的字典,因为Python 3.7+的行为意味着我无法使用==
直接比较字典。
从表面上看,这通常不是问题,因为此更改仅影响插入的顺序。 dict构造函数似乎在创建过程中进行排序-例如:
In [1]: dict_1 = {'a': 1, 'b': 2}
In [2]: dict_2 = {'b': 2, 'a': 1}
In [3]: dict_1 == dict_2
Out[3]: True
但是,请考虑以下示例,该示例使用dict理解来从两个相似(但经过重新排序)的列表中构建dict:
In [4]: list_1 = ['a', 'b', 'c']
In [5]: list_2 = ['c', 'b', 'a']
In [6]: dict_1 = {x:i for i, x in enumerate(list_1)}
In [7]: dict_2 = {x:i for i, x in enumerate(list_2)}
In [8]: dict_1 == dict_2
Out[8]: False
在这种情况下,每个字典是通过一次插入每个元素来构造的,因此锁定了插入顺序。我错误地认为dict理解类似于构造函数的工作方式。
一个简单的解决方案是在字典上使用sorted
。
In [9]: sorted(dict_1) == sorted(dict_2)
Out[9]: True
或者将dict理解包在sorted
调用中:
dict_1 = sorted({x:i for i, x in enumerate(list_1)})
dict_2 = sorted({x:i for i, x in enumerate(list_2)})
如果您已经有了列表,则可以使用以下方法对它们进行排序:
dict_1 = sorted(dict_1)
dict_2 = sorted(dict_2)