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

时间:2017-01-17 05:14:19

标签: python dictionary merge sum python-2.6

我有两个词典

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.值始终是新词典或int(非str)

条件2.如果相同的密钥存在于相同的深度,则该密钥的值必须为总和。

我想也许我可以使用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)

1 个答案:

答案 0 :(得分:1)

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

编辑:错过了python-2.6标签,那里没有dict理解。 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