How to merge dictionaries of dictionaries?

后端 未结 29 2771
渐次进展
渐次进展 2020-11-22 05:13

I need to merge multiple dictionaries, here\'s what I have for instance:

dict1 = {1:{\"a\":{A}}, 2:{\"b\":{B}}}

dict2 = {2:{\"c\":{C}}, 3:{\"d\":{D}}
         


        
29条回答
  •  逝去的感伤
    2020-11-22 06:03

    This version of the function will account for N number of dictionaries, and only dictionaries -- no improper parameters can be passed, or it will raise a TypeError. The merge itself accounts for key conflicts, and instead of overwriting data from a dictionary further down the merge chain, it creates a set of values and appends to that; no data is lost.

    It might not be the most effecient on the page, but it's the most thorough and you're not going to lose any information when you merge your 2 to N dicts.

    def merge_dicts(*dicts):
        if not reduce(lambda x, y: isinstance(y, dict) and x, dicts, True):
            raise TypeError, "Object in *dicts not of type dict"
        if len(dicts) < 2:
            raise ValueError, "Requires 2 or more dict objects"
    
    
        def merge(a, b):
            for d in set(a.keys()).union(b.keys()):
                if d in a and d in b:
                    if type(a[d]) == type(b[d]):
                        if not isinstance(a[d], dict):
                            ret = list({a[d], b[d]})
                            if len(ret) == 1: ret = ret[0]
                            yield (d, sorted(ret))
                        else:
                            yield (d, dict(merge(a[d], b[d])))
                    else:
                        raise TypeError, "Conflicting key:value type assignment"
                elif d in a:
                    yield (d, a[d])
                elif d in b:
                    yield (d, b[d])
                else:
                    raise KeyError
    
        return reduce(lambda x, y: dict(merge(x, y)), dicts[1:], dicts[0])
    
    print merge_dicts({1:1,2:{1:2}},{1:2,2:{3:1}},{4:4})
    

    output: {1: [1, 2], 2: {1: 2, 3: 1}, 4: 4}

提交回复
热议问题