Python 3.7中的无序字典

时间:2019-02-24 05:59:19

标签: python dictionary python-3.7

从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的py​​thon-dev消息:

     

做到这一点。裁定“裁定保留插入顺序”。谢谢!

     

这只是意味着您可以依靠它。其他实现   如果他们希望,Python还必须提供一个插入顺序字典。   是Python 3.7的一致实现。

现在有没有办法在python中实现无序字典?

2 个答案:

答案 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)

tl; dr;

使用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)