【问题标题】:Python dictionary iteration order is unexpectedly sorted. Why? [duplicate]Python 字典迭代顺序意外排序。为什么? [复制]
【发布时间】:2015-05-13 20:05:22
【问题描述】:

字典由连续的整数键填充,如下所示:

d = dict()
for i in range(0, 10):
    d[i] = 100-i

后来,字典项是这样迭代的:

for k, v in d.items():
    print k, v

结果显示项目按数字顺序迭代:

0 100
1 99
2 98
3 97
4 96
5 95
6 94
7 93
8 92
9 91

事实证明,这是我想要的行为,但不是我所期望的。我期望字典以随机顺序迭代。这是怎么回事,我可以依赖公开发布的代码中的这种行为吗?

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    字典不是随机排列的。它们按arbitrary 顺序排列。在这种情况下,你很幸运,它们被分类了。明天,他们可能不会。如果您需要随机性,请使用random。如果您需要排序,请使用sorted()。正如 @BenjaminWohlwend 在 cmets 中提到的,您可以使用 collections.OrderedDict 来跟踪插入顺序。

    在这种情况下,我猜字典正在做某种小整数键优化,就像一个数组一样(例如hash(1) == 1)。这不是保证行为,并且在其他 Python 实现中可能会有所不同。

    【讨论】:

    • 如果需要插入顺序,OrderedDict 会很有帮助 docs.python.org/3/library/…
    • 这不是优化,只是 CPython 整数散列的自然副作用。不过最好不要依赖它!
    • @jonrsharpe:在一定程度上存在有意义的差异,我认为 CPython 的散列本身就是对这个确切用例的优化。六个一个,六个另一个。
    【解决方案2】:

    顺序不是随机的,而是任意的。这意味着您不能依赖它以任何特定顺序进行迭代。有时它可能会按排序顺序排列,但你不能假设它会这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多