合并dict的dict和和和值

2024-04-19 02:11:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种方法来合并多个dict,其中也包含嵌套dict。嵌套dict的数量不是静态的而是动态的。在

最后一个dict应该包含dict的所有dict及其值的总和:

COUNTRY1 = {'a': {'X': 10, 'Y': 18, 'Z': 17}, 'b': {'AA':{'AAx':45,'AAy':22},'BB':{'BBx':45,'BBy':22}}, 'c': 100}
COUNTRY2 = {'a': {'U': 12, 'V': 34, 'W': 23}, 'b': {'AA':{'AAz':23,'AAa':26},'BB':{'BBz':11,'BBa':15}}, 'c': 115}
COUNTRY3 = {'a': {'Y': 15, 'Z': 14, 'X': 12}, 'b': {'AA':{'AAx':45,'AAz':22},'BB':{'BBy':45,'BBz':22}}, 'c': 232}

# After merging the dictionaries the result should look like:
ALL
>>> {'a': {'X': 22, 'Y': 33, 'Z': 31, 'U': 12, 'V': 34, 'W': 23}, 'b': {'AA':{'AAx':90,'AAy':22,'AAz':45,'AAa':26},'BB':{'BBx':45,'BBy':67, 'BBz':33,'BBa':15}}, 'c': 447}

我尝试了以下代码,它允许嵌套dict最多3个嵌套dict。不幸的是,代码没有达到我预期的效果。因此它看起来不是很干净,我觉得这可以用递归函数来完成,但是我找不到方法来做。在

^{pr2}$

Tags: the方法代码数量dictaabbaaa
2条回答

做如下两个函数:

def cal_sum(lst):
    final_dict = dict()
    for l in lst:
        sum(final_dict,l)
    return final_dict

def sum(final_dict,iter_dict):
    for k, v in iter_dict.items():
        if isinstance(v, dict):
            sum(final_dict.setdefault(k, dict()), v)
        elif isinstance(v, int):
            final_dict[k] = final_dict.get(k, 0) + v

按如下方式调用上述代码将生成所需的输出:

^{pr2}$

问题是,您需要根据值的类型来决定如何处理字典键。基本思路是:

  • 输入是一对字典,输出是和字典
  • 使用两个输入字典
  • 如果值是字典,则递归
  • 如果某个值是数字,则将其添加到另一个数字上

这是相当容易实现的理解:

def add_dicts(d1, d2):
    def sum(v1, v2):
        if v2 is None:
            return v1
        try:
            return v1 + v2
        except TypeError:
            return add_dicts(v1, v2)
    result = d2.copy()
    result.update({k: sum(v, d2.get(k)) for k, v in d1.items()})
    return result

复制确保d2中不在d1中的任何键都被简单地复制。在

您现在可以总结如下:

^{pr2}$

一般来说,您可以使用^{}对不确定数量的词典执行此操作:

dicts = [COUNTRY1, COUNTRY2, COUNTRY3]
ALL = reduce(add_dicts, dicts)

相关问题 更多 >