python - 为什么更新字典不按相同顺序排序
问题描述
我写了这段代码:
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}
取而代之?
解决方案
在 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)
推荐阅读
- firebase - 在飞镖中我无法使用用户详细信息?
- json - Unity 未从 Arduino(ESP32)通过蓝牙串行获取 JSON 数据
- php - 如何从对象中获取唯一值。拉拉维尔 8
- javascript - 如何将文本字段中的输入保存到本地存储中,然后在 Angular 中单击按钮后在列中显示项目
- javascript - 如何保存下拉列表中选择的所有值
- wordpress - Wordpress 将 LP 讲师添加到数据库
- python - 如何正确使用返回的 PageObject 与 PyPDF2 提取文本()
- node.js - 如何访问 mongoose find() 外部的变量并返回它
- flutter - 所以,因为poseapp依赖于sdk中的音频播放器^0.17.0和flutter_driver any,版本解析失败
- node.js - prom-client 在 NodeJS 应用程序中为默认指标返回空对象