Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中更新dict列表的最佳实践_Python_Python 3.x_List_Dictionary - Fatal编程技术网

在Python中更新dict列表的最佳实践

在Python中更新dict列表的最佳实践,python,python-3.x,list,dictionary,Python,Python 3.x,List,Dictionary,想知道是否有“最佳实践”方法来更新目录的列表中的项目 假设我有以下内容,我想为列表中的每个dict更新key1 data = [ {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}, {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}, {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'} ] 我知道

想知道是否有“最佳实践”方法来更新
目录的
列表中的项目

假设我有以下内容,我想为列表中的每个dict更新
key1

data = [
    {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'},
    {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'},
    {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
]
我知道我可以使用
范围
枚举
等在
for
循环中进行更新

for i, d in enumerate(data):
    data[i]['key1'] = 'value4'
我也可以使用
列表
理解

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

列表理解创建新的dict而不是更新现有dict,因此速度较慢。
更新_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-mcprofile 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}
ncalls tottime percall cumtime percall文件名:lineno(函数)
100000 0.039 0.000 0.039 0.000 t.py:12(更新2)
1 0.059 0.059 0.188 0.188 t.py:2()
100000 0.090 0.000 0.090 0 0.000 t.py:8(更新1)
1 0.000 0.000 0.188 0.188{内置方法builtins.exec}
1 0.000 0.000 0.000 0.000{方法'disable'的''lsprof.Profiler'对象}

从语义上讲,它们是不同的。列表将创建一个新容器(包括新的子容器),第二个将更新中的子容器-place@juanpa.arrivillaga,我明白。想知道什么/是否有最佳实践是的,这里使用enumerate有点多余