我写了这段代码:
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}
?
答案 0 :(得分:3)
在未对Python 3.7 dict进行排序之前,如果要保留字典中项目的顺序,则必须使用OrderedDict
之所以发生这种情况,是因为字典类型以前使用哈希内置函数和Python解释程序启动时分配的随机种子的组合来实现其哈希表算法。这些行为共同导致字典顺序与插入顺序不匹配,并在程序执行之间随机洗牌。
在Python 3.7中,字典中各项的顺序都得到保留,而您不必再使用OrderedDict。
dict对象的插入顺序保留性质是 声明是Python语言规范的正式组成部分。
字典保留插入顺序的方式现已成为Python语言规范的一部分。您可以依靠这种行为,甚至使其成为您为类和函数设计的API的一部分。
我还测量了创建常规dict和OrderedDict的性能,常规dict比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)