Python 用于对字典中的字典求和的函数

Python 用于对字典中的字典求和的函数,python,dictionary,Python,Dictionary,此函数中的每个循环: def sum_total(files, local_dir): final_dict = {} for i in range(len(files)): with open(local_dir+files[i], 'r') as f: data = f.readlines() res = find_by_tag(data) print('res: ', res)

此函数中的每个循环:

def sum_total(files, local_dir):
    final_dict = {}
    for i in range(len(files)):
        with open(local_dir+files[i], 'r') as f:
            data = f.readlines()
            res = find_by_tag(data)
            print('res: ', res)
            sum_values_from_several_dict_to_one(res)
生成示例输出:

{'Critical Tests': {'failed': 1, 'passed': 2, 'total': 5}, 'All Tests': {'failed': 5, 'passed': 0, 'total': 5}}
{'Critical Tests': {'failed': 2, 'passed': 3, 'total': 5}, 'All Tests': {'failed': 10, 'passed': 12, 'total': 12}}
{'Critical Tests': {'failed': 3, 'passed': 4, 'total': 5}, 'All Tests': {'failed': 10, 'passed': 0, 'total': 10}}
预期输出:

我想将这些值相加到一个字典中,得到如下输出:

{'Critical Tests': {'failed': 6, 'passed': 9, 'total': 15}, 'All Tests': {'failed': 25, 'passed': 12, 'total': 27}}
问题是,“sum\u values\u from\u multive\u dict\u to\u one”函数应该是什么样子?这是我的代码,但它不起作用。。应该改进什么

def sum_values_from_several_dict_to_one(d1):
   final_dict = {}
   for d in d1 <?>:
    for test, results in d.items():
        if test not in final_dict:
            final_dict[test] = {}
        for key, value in results.items():
            if key in final_dict[test]:
                final_dict[test][results] += value
            else:
                final_dict[test][key] = value
   return final_dict
def sum_值从几个dict_到一个(d1):
最终dict={}
对于d1中的d:
对于测试,结果为d.items():
如果测试不在最终目录中:
期末考试[测试]={}
对于键,results.items()中的值:
如果输入最终指令[测试]:
最终记录[测试][结果]+=数值
其他:
最终指令[测试][键]=值
返回最终命令
这里有:

a = {'Critical Tests': {'failed': 1, 'passed': 2, 'total': 5}, 'All Tests': {'failed': 5, 'passed': 0, 'total': 5}}
b = {'Critical Tests': {'failed': 2, 'passed': 3, 'total': 5}, 'All Tests': {'failed': 10, 'passed': 12, 'total': 12}}


def sum_dicts (dict1, dict2):
    res = {}
    for key, val in dict1.items():
        for k, v in dict2.items():
            if k == key:
                if type(val) is dict:
                    res.update({key: sum_dicts(val, v)})
                else:
                    res.update({key: val + v})
                break
    return res


if __name__ == '__main__':
    sol = sum_dicts(a, b)
    print(sol)
输出:

{'All Tests':{'failed':15,'total':17,'passed':12},'Critical Tests':{'failed':3,'total':10,'passed':5}

编辑:

假设
res
是一个dict,您可以这样使用它:

def sum_total(files, local_dir):
    final_dict = {}
    for i in range(len(files)):
        with open(local_dir+files[i], 'r') as f:
            data = f.readlines()
            res = find_by_tag(data)
            print('res: ', res)
            final_dict = sum_dicts(final_dict, res)

您当前的输出是多少?关键测试不应该是15而不是5吗?为什么所有测试都失败了是20次而不是25次(总共3次)@SandraK,预期输出如上所述,电流输出是最后一次'res'value@kk_pl:在您想要的输出中,在“所有测试”下,您有20?不是应该是25吗?我很不清楚你想要什么…@SandraK。是的,应该是25。现在可以了。我只想将sum_total函数中的'res'值求和到一个字典中,以获得预期的输出。您只需将两个字典求和即可。问题是,字典在循环中发生了变化,每个循环都应该将字典值添加到下一个循环的值中。只需查看我的“sum_total”并告诉我如何对“res”值求和。我会编辑它的答案,但它基本上在下一个dict中调用相同的函数。什么数据结构是
res
??一个目录列表?它只是一个目录。通过打印
res
您可以生成上面提到的“示例输出”,检查编辑并让我知道。这很简单。只需在循环中调用
final\u dict=sum\u dicts(final\u dict,res)