0

My question is somewhat different from this one. I have a list of dictionaries as following:

[{'Name': 'A', 'amt1':101, 'amt2':102, 'amt3':103},
 {'Name': 'B', 'amt1':201, 'amt2':202, 'amt3':203},
 {'Name': 'A', 'amt1':301, 'amt2':302, 'amt3':303},
 {'Name': 'C', 'amt1':401, 'amt2':402, 'amt3':403},
 {'Name': 'C', 'amt1':501, 'amt2':502, 'amt3':503},
 {'Name': 'A', 'amt1':601, 'amt2':602, 'amt3':603}]

I want to sum amt for each name and get following result in list of dict:

[{'Name':'A', 'amt1':1003, 'amt2':1006, 'amt3':1009},
 {'Name':'B', 'amt1':201, 'amt2':202, 'amt3':203},
 {'Name':'C', 'amt1':902, 'amt2':904, 'amt3':906}]
fishfree
  • 3
  • 1

4 Answers4

1

To extend the linked answer to multiple keys:

def sum_dicts(lst_of_dicts):
    out = {}

    for d in lst_of_dicts:
        for k in d.keys() - {"Name"}:
            out.setdefault(d["Name"], {"Name": d["Name"]}).setdefault(k, 0)
            out[d["Name"]][k] += d[k]

    return list(out.values())


print(sum_dicts(lst))

Prints:

[
 {'Name': 'A', 'amt2': 1006, 'amt1': 1003, 'amt3': 1009}, 
 {'Name': 'B', 'amt2': 202, 'amt1': 201, 'amt3': 203}, 
 {'Name': 'C', 'amt2': 904, 'amt1': 902, 'amt3': 906}
]
Andrej Kesely
  • 168,389
  • 15
  • 48
  • 91
0

You can achieve this in the following way:

initial_list = [{'Name': 'A', 'amt1':101, 'amt2':102, 'amt3':103},
 {'Name': 'B', 'amt1':201, 'amt2':202, 'amt3':203},
 {'Name': 'A', 'amt1':301, 'amt2':302, 'amt3':303},
 {'Name': 'C', 'amt1':401, 'amt2':402, 'amt3':403},
 {'Name': 'C', 'amt1':501, 'amt2':502, 'amt3':503},
 {'Name': 'A', 'amt1':601, 'amt2':602, 'amt3':603}]
 
temp_dict = {}
final_list = []
i = 0
for item in initial_list:
    if item['Name'] not in temp_dict.keys():
        final_list.append(item)
        temp_dict[item['Name']] = i
        i += 1
    else:
        present_item = final_list[temp_dict[item['Name']]]
        for key, value in item.items():
            if key != "Name":
                present_item[key] += item[key]

print(final_list)

[{'Name': 'A', 'amt1': 1003, 'amt2': 1006, 'amt3': 1009},
{'Name': 'B', 'amt1': 201, 'amt2': 202, 'amt3': 203}, 
{'Name': 'C', 'amt1': 902, 'amt2': 904, 'amt3': 906}]

Yogesh Bhandari
  • 460
  • 2
  • 9
0

We can do it in one expression, but we'll need python3.9+ :(

import json

data = [
    {'Name': 'A', 'amt1':101, 'amt2':102, 'amt3':103},
    {'Name': 'B', 'amt1':201, 'amt2':202, 'amt3':203},
    {'Name': 'A', 'amt1':301, 'amt2':302, 'amt3':303},
    {'Name': 'C', 'amt1':401, 'amt2':402, 'amt3':403},
    {'Name': 'C', 'amt1':501, 'amt2':502, 'amt3':503},
    {'Name': 'A', 'amt1':601, 'amt2':602, 'amt3':603}
]

result = [
    {'Name': name} | {
        key: sum(
            # sum the [key] value
            # for all dictionaries with this name
            d[key] for d in data if d['Name'] == name
        )
        for key in ('amt1', 'amt2', 'amt3')
    }
    # for all unique names
    for name in set(d['Name'] for d in data)
]

print(json.dumps(
    result, indent=2, sort_keys=True,
))

This is the way, friends.

[
  {
    "Name": "C",
    "amt1": 902,
    "amt2": 904,
    "amt3": 906
  },
  {
    "Name": "A",
    "amt1": 1003,
    "amt2": 1006,
    "amt3": 1009
  },
  {
    "Name": "B",
    "amt1": 201,
    "amt2": 202,
    "amt3": 203
  }
]
-1

I am unsure how you want the data returned but this is how you get the sum of rows

dict = [{'Name': 'A', 'amt1':101, 'amt2':102, 'amt3':103},
{'Name': 'B', 'amt1':201, 'amt2':202, 'amt3':203},
{'Name': 'A', 'amt1':301, 'amt2':302, 'amt3':303},
{'Name': 'C', 'amt1':401, 'amt2':402, 'amt3':403},
{'Name': 'C', 'amt1':501, 'amt2':502, 'amt3':503},
{'Name': 'A', 'amt1':601, 'amt2':602, 'amt3':603}]

for item in dict:
    Sum = item['amt1'] + item['amt2'] + item['amt3']
    print(item['Name'], Sum)
Hazzah
  • 85
  • 6