我想合并下面显示的两个词典,但我没有成功。
我看了很多博客文章,但我找不到答案。
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]}}}}
我该怎么做?
答案 0 :(得分:3)
如果你知道预期的深度是多少,你可以使用嵌套的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
视为一个简单的字典。
使用标准dicts,您必须使用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)