首頁  >  問答  >  主體

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方法都是只能一層,不知道有沒有好的實作方法?

阿神阿神2675 天前906

全部回覆(2)我來回復

  • PHP中文网

    PHP中文网2017-06-22 11:54:21

    隨手寫了一個 應對多層 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 不要怪我

    回覆
    0
  • 代言

    代言2017-06-22 11:54:21

    對於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}}

    你將上述操作封裝為函數即可。

    回覆
    0
  • 取消回覆