2017-10-13 113 views
4

我正在尋找合併下面顯示的兩個字典,但是我沒有成功這樣做。在具有相同密鑰的字典中合併兩個Python字典

我已經閱讀了很多博客文章,但沒有找到答案。

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

做你的類型的字典具有恆定的深度或他們inderminate subdicts? – lotrus28

+0

,因爲你必須爲你的字典定義一個結構。有4級以上?只有最後一個級別必須是一個列表?我們可以在每個級別的兩個字典中有不同的元素嗎? –

+0

他們有不變的深度 –

回答

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)