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

2024-06-07 18:39:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典列表,我想附加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}
]

Tags: namedevtest列表datadatebytime
2条回答

我看到两个问题:

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值产生奇怪的后果—它会将对同一list对象的引用复制到新dict中,因此改变该值也会改变原始dict。不过,这可能超出了我们讨论的范围

你可以在一条线上完成

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

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

相关问题 更多 >

    热门问题