将额外的键值附加到现有字典列表中

时间:2019-07-08 21:33:30

标签: 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_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}
]

由于我将maxminstd_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}
]

2 个答案:

答案 0 :(得分:1)

我在这里看到两个问题:

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将所有键/值对从一个字典复制到另一个字典。这样会使更新后的字典发生变异,因此无需建立新列表。

    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值造成奇怪的结果-它将对同一列表对象的引用复制到新字典中,因此对该值进行更改也会使其发生更改原本的。但是,这可能不在本讨论范围之内。

答案 1 :(得分:0)

您可以一行完成

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

这将从您的旧列表和新列表中获取每一对字典,并将两个字典合并为一个