Вы должны группировать на основе комбинированного ключа имени 'Period 40'
и даты внутри 'metadata'
, поэтому все 'Period 40'
одной и той же даты суммируются в одну - то же самое для 'Period 41'
This может работать (числа изменились, чтобы упростить математические доказательства для групп и добавлений):
from itertools import groupby
data = [{ "name": "Period 40", "metadata": { "payPeriod": "Weekly",
"startDate": "2020-01-03", "totalCost": 5, "gross": 8 } },
{"name": "Period 41", "metadata": { "payPeriod": "Weekly",
"startDate": "2020-01-03", "totalCost": 2.5, "gross": 3 } },
{ "name": "Period 41", "metadata": { "payPeriod": "Weekly",
"startDate": "2020-01-03", "totalCost": 99, "gross": 110 } },
{"name": "Period 40", "metadata": { "payPeriod": "Weekly",
"startDate": "2020-01-03", "totalCost": 10, "gross": 18 } }]
# groupby needs sorted data - use (name, startdate) to sort by
sorted_data = sorted(data, key=lambda x: (x["name"],x["metadata"]["startDate"]))
# groupby (name, startdate)
grped = groupby( sorted_data , lambda x: (x["name"],x["metadata"]["startDate"]))
results = []
# key is the combined key (name, startdate), we need to reapply name in the result
for key,value in grped:
first, *vv = value # get the first inner grouped result into first
# put the others into vv
first.update({"name":key[0]}) # add the key back into the grouped thing
for v in vv: # add the remaining inner metadatas
first["metadata"]["totalCost"] += v["metadata"]["totalCost"]
first["metadata"]["gross"] += v["metadata"]["gross"]
results.append(first)
from pprint import pprint
pprint(results)
Вывод:
[{'metadata': {'gross': 26,
'payPeriod': 'Weekly',
'startDate': '2020-01-03',
'totalCost': 15},
'name': 'Period 40'},
{'metadata': {'gross': 113,
'payPeriod': 'Weekly',
'startDate': '2020-01-03',
'totalCost': 101.5},
'name': 'Period 41'}]
HTH