python 合并dict
問題描述
現在有兩個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方法都是只能一層,不知道有沒有好的實現方法?
問題解答
回答1:隨手寫了一個 應對多層 dictionary 的 merge
from itertools import chainfrom functools import reducedef 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 不要怪我
回答2:對于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}}
你將上述操作封裝為函數即可。
相關文章:
1. windows - asp.net連接上mysql之后如何調用?比如下面的登錄驗證功能怎么實現2. 剛放到服務器的項目出現這中錯誤,有高手指點嗎3. css3 - Typecho 后臺部分表單按鈕在 Chrome 下出現靈異動畫問題,求解決4. apache - 想把之前寫的單機版 windows 軟件改成網絡版,讓每個用戶可以注冊并登錄。類似 qq 的登陸,怎么架設服務器呢?5. mysql - 面試題:如何把login_log表轉換成last_login表?6. javascript - nodejs實現異步時遇到的一個問題7. javascript - 為什么嵌套的Promise不能按預期捕獲Exception?8. javascript - 編程,算法的問題9. css - 手機qq打開網頁無法使用文件上傳功能?10. java - HTTPS雙向認證基礎上有無必要再進行加簽驗簽?
