kk_pl
kk_pl

Reputation: 85

Function for summing the dictionaries in the dictionary

Every loop in this function:

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)

Generates example output:

{'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}}

EXPECTED OUTPUT:

I would like to sum those values into one dictionary to get output like:

{'Critical Tests': {'failed': 6, 'passed': 9, 'total': 15}, 'All Tests': {'failed': 25, 'passed': 12, 'total': 27}}

The problem is - how should the 'sum_values_from_several_dict_to_one' function looks like? Thats my code but it does not work.. What should be improved?

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

Upvotes: 1

Views: 63

Answers (1)

epinal
epinal

Reputation: 1465

Here you have:

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)

Output:

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

EDIT:

Assuming res is a dict you can use it like this:

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)

Upvotes: 1

Related Questions