Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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 向现有词典列表追加额外的键值_Python_Json_File - Fatal编程技术网

Python 向现有词典列表追加额外的键值

Python 向现有词典列表追加额外的键值,python,json,file,Python,Json,File,我有一个字典列表,我想在其中附加3个键值对 词典目录 [ {'by': 270.74, 'by_l': [270.74], 'date_time': '2019-07-08 14:21:42', 'name': 'test_1', 't_avg': 29.69, 't_runs': [29.69]}, {'by': 432.17, 'by_l': [432.17], 'date_time': '2019-07-08 14:21:47', 'name': 'test_2', 't_

我有一个字典列表,我想在其中附加3个键值对

词典目录

[
    {'by': 270.74, 'by_l': [270.74], 'date_time': '2019-07-08 14:21:42', 'name': 'test_1', 't_avg': 29.69, 't_runs': [29.69]},
    {'by': 432.17, 'by_l': [432.17], 'date_time': '2019-07-08 14:21:47', 'name': 'test_2', 't_avg': 47.39, 't_runs': [47.39]}
]
必须附加的东西

{'max': 70, 'min': 30, 'std_dev': 15.01},
{'max': 70, 'min': 30, 'std_dev': 15.01}`
所以它看起来像这样:

[
    {'by': 270.74, 'by_l': [270.74], 'date_time': '2019-07-08 14:21:42', 'name': 'test_1', 't_avg': 29.69, 't_runs': [29.69], 'max': 70, 'min': 30, 'std_dev': 15.016218454280247},
    {'by': 432.17, 'by_l': [432.17], 'date_time': '2019-07-08 14:21:47', 'name': 'test_2', 't_avg': 47.39, 't_runs': [47.39], 'max': 70, 'min': 30, 'std_dev': 15.01}
]
由于我将
max
min
std_dev
存储在各自的列表中,因此我尝试了以下操作:

past_data = {
    'max': 0,
    'min': 0,
    'std_dev': 0
}

for x in range(0, len(max_list)):
    past_data['max'] = max_list[x]
    past_data['min'] = min_list[x]
    past_data['std_dev'] = std_dev_list[x]
    output_data.append(past_data)
但我得到以下输出:

[
    {'by': 270.74, 'by_l': [270.74], 'date_time': '2019-07-08 14:21:42', 'name': 'test_1', 't_avg': 29.69, 't_runs': [29.69]},
    {'by': 432.17, 'by_l': [432.17], 'date_time': '2019-07-08 14:21:47', 'name': 'test_2', 't_avg': 47.39, 't_runs': [47.39]},{'max': 70, 'min': 30, 'std_dev': 15.01}, {'max': 70, 'min': 30, 'std_dev': 15.01}
]

我在这里看到两个问题:

1) 如何同步迭代两个列表

2) 给定两本词典,如何将一本合并到另一本

首先,
zip
通常是最好的:

for (d1, d2) in zip(list_of_dictionary, max_list):
如果要使用显式列表索引,它将如下所示:

for i in range(0, math.min(len(list_of_dictionary), len(max_list)):
    d1 = list_of_dictionary[i]
    d2 = max_list[i]
对于第二种情况,使用
update
将所有键/值对从一个dict复制到另一个dict。这会对更新后的字典进行变异,因此无需构建新的列表

    d1.update(d2)
如果你想避免编辑最初的字典,那就有点难了。一种方法是:

    copied_data = {}
    copied_data.update(d1)
    # or just copied_data = d1.copy()
    copied_data.update(d2)
    output_data.append(copied_data)
有更简洁的方法从现有的浅显副本中构建新的dict,但我个人认为它们更难遵循


这是一个浅拷贝,这可能很好,但可能会对您的
by_l
值产生奇怪的后果-它会将对同一列表对象的引用复制到新的dict中,因此对该值进行变异也会对原始值进行变异。不过,这可能超出了本次讨论的范围。

您只需一行就可以做到这一点

output_data = [{**a, **b} for a, b in zip(list_of_dictionary, max_list)]

这将从旧列表和新列表中获取每一对词典,并将这两个词典合并为一个,即max_list。你的意思是
{'max':70,'min':30,'std_dev':15.01},{'max':70,'min':30,'std_dev':15.01}