[英]Merging multiple dictionaries in python
我的字典如下:
{"item1": {"item2": "300"}}
{"item1": {"item3": {"item4": "400"}}}
{"item1": {"item3": {"item6": "16"}}}
{"item1": {"item7": "aaa"}}
{"item1": {"item8": "bbb"}}
{"item1": {"item9": {"item10" : "2.2"}}}
{"item1": {"item9": {"item11" : "xxx"}}}
我想將這些字典合並如下
{
"item1": {
"item2": "300",
"item3": {
"item4": "400",
"item6": "16"
},
"item7": "aaa",
"item8": "bbb",
"item9": {
"item10": "2.2",
"item11": "xxx"
}
}
}
item1是所有詞典中的第一個鍵,而嵌套鍵將有所不同。 如果兩個字典的字典中有相同的嵌套字典,則必須合並鍵(例如:字典1和2中的item3)。 我怎樣才能做到這一點?
dico_list=[{"item1": {"item2": "300"}}, {"item1": {"item3": {"item4": "400"}}}, {"item1": {"item3": {"item6": "16"}}}, {"item1": {"item7": "aaa"}}, {"item1": {"item8": "bbb"}}, {"item1": {"item9": {"item10" : "2.2"}}}, {"item1": {"item9": {"item11" : "xxx"}}}]
def merge(merge_dico,dico_list):
for dico in dico_list:
for key,value in dico.items():
if type(value)==type(dict()):
merge_dico.setdefault(key,dict())
merge(merge_dico[key],[value])
else:
merge_dico[key]=value
return merge_dico
print(merge(dict(),dico_list))
#{'item1': {'item7': 'aaa', 'item9': {'item11': 'xxx', 'item10': '2.2'}, 'item8': 'bbb', 'item3': {'item4': '400', 'item6': '16'}, 'item2': '300'}}
我認為使用遞歸輔助函數最簡單:
def merge_dict_into(target, d):
for key, value in d:
if isinstance(value, dict):
recursive_target = target.setdefault(key, {})
# if not isintance(recursive_target, dict): raise ValueError
merge_dict_into(recursive_target, value)
else:
# if key in target: raise ValueError
target[key] = value
def merge_dicts(dicts):
target = {}
for d in dicts:
merge_dict_into(target, d)
return target
我不確定您要如何處理有沖突的字典。 例如,將{"a": 0}
與{"a": 1}
或{"a": {"b": 2}}
合並。 上面的代碼允許非字典值覆蓋先前的值,但是如果字典試圖替換非字典,則它將失敗。 您可以取消注釋錯誤檢查行以使任何沖突引發異常,或者編寫自己的錯誤處理邏輯來解決沖突。
與其他類似,使用遞歸函數,但是還會檢查樹中是否存在重復值:
from pprint import pprint
dicts = [{"item1": {"item2": "300"}},
{"item1": {"item3": {"item4": "400"}}},
{"item1": {"item3": {"item6": "16"}}},
{"item1": {"item7": "aaa"}},
{"item1": {"item8": "bbb"}},
{"item1": {"item9": {"item10" : "2.2"}}},
{"item1": {"item9": {"item11" : "xxx"}}},]
def walk_tree(fill_dict, mydict):
for key, val in mydict.iteritems():
if isinstance(val, dict):
if key not in fill_dict.keys():
fill_dict[key] = {}
walk_tree(fill_dict[key], val)
else:
if key in fill_dict.keys():
raise(StandardError, 'Duplicate')
fill_dict[key] = val
dicts_total = {}
for mydict in dicts:
walk_tree(dicts_total, mydict)
pprint(dicts_total)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.