用于在词典中对词典进行求和的功能

时间:2018-02-27 20:01:15

标签: 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)
            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_values_from_several_dict_to_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

1 个答案:

答案 0 :(得分:1)

你有:

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是一个词典,你可以像这样使用它:

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)