現在有兩個dict,這個dict有兩層(如果可以自訂層數或不限更好),想合併起來
case1:輸入:a: {1:{"171": True}} b:{1:{"172": False}}輸出:{1:{"171": True , "172": False}}
case2:輸入:a: {1:{"171": True}} b:{1:{"171": False}}輸出:{1:{"171": False }}
我使用python的dict.update方法都是只能一層,不知道有沒有好的實作方法?
闭关修行中......
隨手寫了一個 應對多層 dictionary 的 merge
from itertools import chain from functools import reduce def deep_merge_func(acc, item): if not acc: acc = {} k, v = item if isinstance(v, dict): original_v = acc.get(k) if original_v and isinstance(original_v, dict): return {**acc, k: deep_merge(original_v, v)} return {**acc, k: v} def deep_merge(origin, target): return reduce(deep_merge_func, chain(origin.items(), target.items()), None) a = {1: {"171": True}} b = {1: {"171": False}} print(deep_merge(a, b)) c = {1: {"171": True}} d = {1: {"172": False}} print(deep_merge(c ,d))
只測試了 python3.6.1 你只需要呼叫 deep_merge 就行了
寫得比較 functional 不要怪我
對於case2就比較簡單:
>>> a={1:{"171": True}} >>> b={1:{"171":False}} >>> a.update(b) >>> a {1: {'171': False}}
對於case1可以這樣操作:
>>> c={} >>> for k,v in a.items(): ... if k in b: ... v.update(b[k]) ... c[k] = v ... >>> c {1: {'172': False, '171': True}}
你將上述操作封裝為函數即可。
隨手寫了一個 應對多層 dictionary 的 merge
只測試了 python3.6.1 你只需要呼叫 deep_merge 就行了
寫得比較 functional 不要怪我
對於case2就比較簡單:
對於case1可以這樣操作:
你將上述操作封裝為函數即可。