Python 向现有词典列表追加额外的键值
我有一个字典列表,我想在其中附加3个键值对 词典目录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_
[
{'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}