使用相同的键将字典作为值添加到另一个字典

时间:2019-12-06 01:39:07

标签: python dictionary

我有一本类似以下的字典-

parent_key : {child : 1, child :2}

我还有另一本格式相同的字典-

parent_key : {child : 3, child :2}

两者具有相同的父键和相同的子键。我需要获得如下输出-

parent_key : {{child : 1, child :2},{child : 3, child :2}}

如果我使用update()方法,它将仅使用最新值更新密钥,但我需要使用指定的格式。请帮忙!

2 个答案:

答案 0 :(得分:1)

您的输出表示一组词典:

parent_key : {{child : 1, child :2},{child : 3, child :2}}

这是无效的。我还假设这些键实际上不是重复的键,而您只是将每个键替换为child。否则,最终结果将更加无效,因为字典不能有重复的键。

相反,我建议改为创建此结构:

{parent_key : [{child1 : 1, child2 :2}, {child1 : 3, child2 :2}]}

哪一个将每个内部子词典收集到一个列表中,该列表似乎与您要实现的目标最接近。

演示:

from collections import defaultdict

d1 = {"a": {"b": 1, "c": 2}}
d2 = {"a": {"b": 3, "c": 2}}

final_d = defaultdict(list)
for d in (d1, d2):
    for k, v in d.items():
        final_d[k].append(v)

print(final_d)
# defaultdict(<class 'list'>, {'a': [{'b': 1, 'c': 2}, {'b': 3, 'c': 2}]})

print(dict(d))
# {'a': [{'b': 1, 'c': 2}, {'b': 3, 'c': 2}]}

以上内容使用列表的collections.defaultdict将字典聚合为一个列表。

您还可以这样实现嵌套字典结果:

{parent_key : {child1: [1, 3], child2: [2, 2]}}

演示:

from collections import defaultdict

d1 = {"a": {"b": 1, "c": 2}}
d2 = {"a": {"b": 3, "c": 2}}

final_d = defaultdict(lambda: defaultdict(list))

for d in (d1, d2):
    for k1, v1 in d.items():
        for k2, v2 in v1.items():
            final_d[k1][k2].append(v2)

print(final_d)
# {'a': defaultdict(<class 'list'>, {'b': [1, 3], 'c': [2, 2]})}

print({k: dict(v) for k, v in final_d.items()})
# {'a': {'b': [1, 3], 'c': [2, 2]}}

注意:defaultdictdict的子类,因此它充当普通词典。我刚刚打印了两个带有defaultdict的版本,为了方便起见。

答案 1 :(得分:0)

您可以这样做:

AddDefaultIdentity