python - 在具有相同键的字典中合并两个 Python 字典

标签 python dictionary merge

我想合并下面显示的两个词典,但我没有成功。

我看了很多博文,但没有找到答案。

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]}}}}

我该怎么做?

最佳答案

使用默认字典

如果您知道预期深度是多少,您可以使用嵌套 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)

关于python - 在具有相同键的字典中合并两个 Python 字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46734031/

相关文章:

python - 在python中将嵌套字典列表写入excel文件

algorithm - 验证一次排序 M 个 N 个整数的复杂性

git - 文件在提交之间更改但将文件列表限制为较旧的提交

Python - 重新启动 for 循环的方法,类似于 "continue"for while 循环?

python - 使用Docker运行项目失败

python请求模块记录编码

Python 属性错误 : 'dict' object has no attribute 'append'

python - 暴力稳定婚姻,如何实现2个列表之间所有可能的配对?

c++ - 根据出现次数最多的标签快速标记一些元素

version-control - 能否/应该避免频繁 merge (例如通过 rebase )?