【问题标题】:Unordered dict in python 3.7python 3.7中的无序字典
【发布时间】:2019-07-17 20:28:58
【问题描述】:

python 中的字典是从 Python 3.6 开始排序的

来自 - 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中实现无序字典?

【问题讨论】:

  • 有没有办法实现无序字典当然——自己写。
  • 有什么特别的原因吗?你可以通过在键上使用random.shuffle 来模仿无序行为,如果你真的想要访问它们。
  • @jasonharper 我不希望 dict 记住插入顺序。我不在乎字典返回的许多可能的顺序之一是否是插入键的顺序。
  • 你为什么想要那个?
  • 我不明白这一点。字典的一般用例是 O(1) 查找。排序只会在迭代中产生差异,而且通常便于保持一致。你到底想做什么?

标签: python dictionary python-3.7


【解决方案1】:

你可以伪造它:

>>> 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]}
>>> 

【讨论】:

  • 如果 dict 中的键数量足够大,是否有可能随机改组键、值对?
  • @PratyushDas 我不这么认为
  • 我怀疑这个问题的目的不是想要一个不可预测的(随机)顺序,而是更多关于想要一个可预测和一致的顺序(即按键排序的原始行为),而不考虑插入订购。
【解决方案2】:

正如一些人所提到的,这将有助于理解为什么你想要一个无序的字典。就我个人而言,我正在寻找一个无序的字典,因为我正在使用 OrderedDicts,它们的行为意味着我无法使用 == 直接比较它们。例如:

In [1]: from collections import OrderedDict
In [2]: dict_1 = OrderedDict([('a', 0), ('b', 1), ('c', 2)])
In [3]: dict_2 = OrderedDict([('c', 2), ('b', 1), ('a', 0)])
In [4]: dict_1 == dict_2
Out[4]: False

解决这个问题的一个简单方法是将 OrderedDict 变回字典。

In [5]: dict(dict_1) == dict(dict_2)
Out[5]: True

【讨论】:

  • 请注意,在字典上调用sorted 会生成字典键的排序列表,而不是字典的排序副本。字典本身仍然是无序的。此外,dict 文字和 dict 构造函数都从左到右对初始元素进行排序,而 dict 推导式则按其迭代顺序插入。在答案中使用dict理解创建的两个字典不相等,因为它们具有不同的键值对,因为它们是通过枚举不同的列表构造的:dict_1 == {'a': 0, 'b': 1, 'c': 2}dict_2 == {'c': 0, 'b': 1, 'a': 2}
  • jirassimok,谢谢,你说得对。我重新阅读了我的帖子并意识到我犯了一些导致错误假设的错误。鉴于此,我已经完全重写了我的答案。
猜你喜欢
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 2019-09-21
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
相关资源
最近更新 更多