合并两个Python字典,其中包含相同键的字典

4
我想合并下面展示的两个字典,但我没有成功。
我已经阅读了很多博客文章,但是没有找到答案。
dict1={"KPNS": {"metadocdep": {"eta": {"sal": "2"}}, "metadocdisp": {"meta": {"head": "1"}}}, "EGLS": {"apns": {"eta": {"sal": "2"}}, "gcm": {"meta": {"head": "1"}}}}

dict2={"KPNS": {"metadocdep": {"eta": {"sal": "7"}}, "metadocdisp": {"meta": {"head": "5"}}}, "EGLS": {"apns": {"eta": {"sal": "7"}}, "gcm": {"meta": {"head": "9"}}}}
finaldict = {key:(dict1[key], dict2[key]) for key in dict1}

print finaldict

我的最终输出应该如下所示:
{"KPNS": {"metadocdep": {"eta": {"sal": [2,7]}},
          "metadocdisp": {"meta": {"head": [1,5]}}},
 "EGLS": {"apns": {"eta": {"sal": [2,7]}},
          "gcm": {"meta": {"head": [1,9]}}}}

我该如何做到这一点?

你的字典是否具有恒定深度,还是具有不确定的子字典? - lotrus28
因为你必须为你的字典定义一个结构。它是否超过4个级别?只有最后一级必须是列表吗?在每个级别中,两个字典中可以有不同的元素吗? - Adouani Riadh
它们具有恒定的深度。 - saketh modugu
@AdouaniRiadh 只有最后一层会是一个列表。每个级别中没有不同的元素。 - saketh modugu
1个回答

3

使用defaultdict

如果您知道预期深度,可以使用嵌套的defaultdicts来定义final_dict

from collections import defaultdict

final_dict = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))

final_dict['a']['b']['c'].append(1)
print(final_dict)
# defaultdict(<function <lambda> at 0x7f2ae7f41e18>, {'a': defaultdict(<function <lambda>.<locals>.<lambda> at 0x7f2ae636b730>, {'b': defaultdict(<class 'list'>, {'c': [1]})})})

由于使用了defaultdict,输出的内容增加了很多,但你可以将final_dict视为普通字典。

使用字典

对于标准字典,你需要使用setdefault。但代码不太易读:

dict1 = {"KPNS": {"metadocdep": {"eta": {"sal": "2"}}, "metadocdisp": {"meta": {
    "head": "1"}}}, "EGLS": {"apns": {"eta": {"sal": "2"}}, "gcm": {"meta": {"head": "1"}}}}

dict2 = {"KPNS": {"metadocdep": {"eta": {"sal": "7"}}, "metadocdisp": {"meta": {
    "head": "5"}}}, "EGLS": {"apns": {"eta": {"sal": "7"}}, "gcm": {"meta": {"head": "9"}}}}

final_dict = {}
for d in [dict1, dict2]:
    for level1 in d:
        for level2 in d[level1]:
            for level3 in d[level1][level2]:
                for level4 in d[level1][level2][level3]:
                    final_dict.setdefault(level1, {}).setdefault(level2, {}).setdefault(
                        level3, {}).setdefault(level4, []).append(d[level1][level2][level3][level4])

print(final_dict)
# {'KPNS': {'metadocdep': {'eta': {'sal': ['2', '7']}}, 'metadocdisp': {'meta': {'head': ['1', '5']}}}, 'EGLS': {'apns': {'eta': {'sal': ['2', '7']}}, 'gcm': {'meta': {'head': ['1', '9']}}}}

使用 dict.items() 可能会更加高效:

for d in [dict1, dict2]:
    for level1, d2s in d.items():
        for level2, d3s in d2s.items():
            for level3, d4s in d3s.items():
                for level4, v in d4s.items():
                    final_dict.setdefault(level1, {}).setdefault(level2, {}).setdefault(
                        level3, {}).setdefault(level4, []).append(v)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接