【问题标题】:In what order does a dictionary in python store data? [duplicate]python中的字典以什么顺序存储数据? [复制]
【发布时间】:2013-05-25 18:20:05
【问题描述】:

我想知道 python 中的字典以什么顺序存储键:值对。我在我的 python shell 中编写了以下内容,但我无法弄清楚它存储键的顺序的原因是什么:值对。

>>> d = {}
>>> d['a'] = 8
>>> d['b'] = 8
>>> d
{'a': 8, 'b': 8}
>>> d['c'] = 8
>>> d
{'a': 8, 'c': 8, 'b': 8}
>>> d['z'] = 8
>>> d
{'a': 8, 'c': 8, 'b': 8, 'z': 8}
>>> d['w'] = 8
>>> d
{'a': 8, 'c': 8, 'b': 8, 'z': 8, 'w': 8}

我也尝试了同样的事情,对相同的键使用不同的值。但顺序保持不变。再添加一个 key : value 对会给出另一个无法确定的结果。这里是:

>>> d[1] = 8
>>> d
{'a': 8, 1: 8, 'c': 8, 'b': 8, 'w': 8, 'z': 8}

【问题讨论】:

  • 没有保证订购;插入和删除,键值决定顺序。
  • 字典在 python 中是无序的,就像列表和元组一样,@Indradhanush Gupta 你在评论中有一个很好的链接
  • @IndradhanushGupta:当然,重播相同的插入意味着您再次看到相同的订单。但是,如果您添加了一些删除,那么您可能会得到不同的顺序。使用不同的 Python 版本或不同的 Python 实现(IronPython、Jython、PyPy),您可能会得到完全不同的顺序。
  • 随着最近 CPython 的变化,你甚至不需要改变任何东西。由于哈希随机化,只需使用相同的参数和相同的 Python 实现运行相同的程序可能会产生不同的顺序。

标签: python


【解决方案1】:

简短的回答是:按照实现定义的顺序。您不能依赖也不应该期望任何特定的顺序,并且它可以在以所谓的不相关方式更改字典后更改。

虽然不是直接的,但在Dictionary view objects中有某种解释:

键和值以非随机的任意顺序迭代,随 Python 实现而变化,并且取决于字典的插入和删除历史。如果键、值和项目视图被迭代而没有对字典进行干预修改,项目的顺序将直接对应。

【讨论】:

    【解决方案2】:

    元素是根据其键的哈希值存储的。该文档指出key must be a hashable type

    【讨论】:

      【解决方案3】:

      字典没有可预测的顺序,因为它们的键是通过散列存储的。如果您需要订购,请使用listcollections.OrderedDict

      【讨论】:

        【解决方案4】:

        这是hash table。键按其哈希值hash(key) 部分排序,但字典的实际遍历顺序可能取决于插入元素的顺序、字典中元素的数量以及可能的其他因素。你永远不应该指望它是什么特别的东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-24
          • 1970-01-01
          • 2013-01-04
          相关资源
          最近更新 更多