python - 在 Python 中更新字典列表的最佳实践
问题描述
想知道是否有“最佳实践”方法来更新 a list
of中的项目dicts
。
假设我有以下内容,我想key1
为列表中的每个 dict更新
data = [
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'},
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'},
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
]
我知道我可以使用或喜欢for
循环进行更新range
enumerate
for i, d in enumerate(data):
data[i]['key1'] = 'value4'
我也可以使用list
理解
data = [{'key1': 'value4', 'key2': d['key2'], 'key3': d['key3']} for d in data]
dict
但是,如果s中有很多键/值对,我觉得这种方法可能会变得容易出错
还有其他我忽略的方法吗?
PS我注意到循环比理解要快得多。这对事情有影响吗?
In [12]: %timeit [{'key1': 'value4', 'key2': d['key2'], 'key3': d['key3']} for d in data]
The slowest run took 8.41 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.25 µs per loop
In [14]: %timeit for i, d in enumerate(data): data[i]['key1'] = 'value4'
The slowest run took 5.20 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 541 ns per loop
解决方案
列表理解创建新的字典而不是更新现有的字典,所以它更慢。
update_2() 可能更快:
data = [
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'},
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'},
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
]
def update_1():
for i, d in enumerate(data):
data[i]['key1'] = 'value4'
def update_2():
for d in data:
d['key1'] = 'value4'
for _ in range(100000):
update_1()
for _ in range(100000):
update_2()
然后python -m cProfile test.py
ncalls tottime percall cumtime percall filename:lineno(function)
100000 0.039 0.000 0.039 0.000 t.py:12(update_2)
1 0.059 0.059 0.188 0.188 t.py:2(<module>)
100000 0.090 0.000 0.090 0.000 t.py:8(update_1)
1 0.000 0.000 0.188 0.188 {built-in method builtins.exec}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
推荐阅读
- firebase - Flutter - 将图像上传到 Firebase 存储
- azure - 管道代理工件(autologon = true)在 Win 10 上未上线
- c++ - 带有随机数的 C++ 猜谜游戏问题
- python - pip install 给出 ModuleNotFoundError
- javascript - 变量或常量可以在 JavaScript 中存储运算符吗?
- javascript - 如何在jquery中访问关联数组中的数组
- python - 通过 Spotify API 从播放列表中获取 ID
- css - 尝试在 Git add 中添加图像但不断收到以下消息?我尝试重新启动/重新加载 git 并关闭 VS Code,但没有任何效果
- python - 如何在python中获取str中的值(不是数组/列表格式)
- scala - Scala 未来返回类型