【问题标题】:Why updating Dictionary is not sorted by the same order为什么更新字典不按相同顺序排序
【发布时间】:2019-11-30 11:32:42
【问题描述】:

我写了这段代码:

words_dict = {}
my_list = ["a", "b", "c", "d", "e"]
for st in my_list:
    words_dict.update({st: 0})
print words_dict

我期望的输出是:

{'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 0}

但我明白了

{'a': 0, 'c': 0, 'b': 0, 'e': 0, 'd': 0}

为什么会发生这种情况,我怎样才能获得{'a':0, 'b':0, 'c':0, 'd':0, 'e':0}

【问题讨论】:

  • 字典本质上是无序的。注意,你不应该对单个值使用更新,使用words_dict[st] = 0
  • 如果您必须按字母顺序使用字典中的值,然后获取键,对它们进行排序并使用它们来获取值。

标签: python list python-2.7 dictionary


【解决方案1】:

在 Python 3.7 之前,dict 没有排序,如果您想保留字典中项目的顺序,您必须使用 OrderedDict

发生这种情况是因为字典类型之前使用哈希内置函数和 Python 解释器启动时分配的随机种子组合实现了其哈希表算法。这些行为共同导致字典排序与插入顺序不匹配,并在程序执行之间随机打乱。

Python 3.7及以上字典中的项目顺序被保留,你不必再使用OrderedDict了。

dict 对象的插入顺序保存特性已 声明为 Python 语言规范的官方部分。

字典保存插入顺序的方式现在是 Python 语言规范的一部分。您可以依赖此行为,甚至可以将其作为您为类和函数设计的 API 的一部分。

我还测量了创建常规字典和 OrderedDict 的性能,常规字典比 OrderedDict 快大约 2.5-3 倍

from collections import OrderedDict

data = [(i, chr(i)) for i in range(65, 91)]


%%timeit

d = dict(data)

2.27 µs ± 235 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)


%%timeit

d = OrderedDict(data)

6.59 µs ± 1.32 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)


%%timeit

d = {}

for k, v in data:
    d[k] = v

4.84 µs ± 1.31 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)


%%timeit

d = OrderedDict()

for k, v in data:
    d[k] = v

7.48 µs ± 1.6 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)

【讨论】:

    猜你喜欢
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2020-08-02
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多