如何合并和求和两个字典键和项?

How can I merge and sum two dictionary key and items?

我有两本字典

dict1 = {
"list": {
    "alpha": {
        "a": {
            "score": 1,
            "visit": 2
        },
        "b": {
            "score": 3,
            "visit": 4
        }
    },
    "beta" : {
        "a": {
            "score": 1,
            "visit": 2
        },
        "b": {
            "score": 3,
            "visit": 4
        }
    }
}
}

dict2 = {
"list": {
    "alpha": {
        "a": {
            "score": 1,
            "visit": 2
        },
        "c": {
            "score": 5,
            "visit": 6
        }
    },
    "beta" : {
        "a": {
            "score": 1,
            "visit": 2
        },
        "c": {
            "score": 5,
            "visit": 6
        }
    }
}
}

我想这样合并字典

dict1 = {
"list": {
    "alpha": {
        "a"  : {
            "score": 2,
            "visit": 4
        },
        "b": {
            "score": 3,
            "visit": 4
        },
        "c": {
            "score": 5,
            "visit": 6
        }
    },
    "beta": {
        "a": {
            "score": 2,
            "visit": 4
        },
        "b": {
            "score": 3,
            "visit": 4
        },
        "c": {
            "score": 5,
            "visit": 6
        }
    }
}
}

条件 1. value 始终为新字典或 int(而非 str)

条件2.如果相同的key存在于相同的深度,则该key的值必须是sum。


我想也许我可以使用 for 循环来解决这个问题。 不过Python好像有更简单快捷的方法

这是我最好的。

代码:

def logic(d1, d2, inconflict = lambda v1,v2 : v1+v2) :
    for k in d2:
        if k in d1 :
            if isinstance(d1[k], dict) and isinstance(d2[k], dict) :
                logic(d1[k], d2[k], inconflict)

            elif isinstance(d1[k], int) :
                d1[k] = inconflict(d1[k], d2[k])
        else :
            d1[k] = d2[k]
    return d1

print logic(dict1, dict2)

这是一个递归数据结构;让我们使用递归。

编辑:错过了 python-2.6 标签,那里没有听写理解。 Edit2:复制值,以防它们只存在于两者之一中,否则你会 运行 惊讶地发现在两个不同的词典中引用同一个词典。

import copy

def recursively_sum(var1, var2):
    """If var1 and var2 are ints, return their sum. Otherwise they are dicts
    and we recursively sum for each key that is either in var1 or var2."""

    if var1 is None:
        return copy.deepcopy(var2)
    elif var2 is None:
        return copy.deepcopy(var1)
    elif isinstance(var1, int):
        return var1 + var2
    else:
        result = {}
        for key in set(var1) | set(var2):
            result[key] = recursively_sum(var1.get(key), var2.get(key))
        return result