Add all duplicate values from list of dictionaries

Viewed 69

I have a list of dictionaries:

foo = [{'date':'01-08-2022', 'pre_val':90, 'cur_val':100},{'date':'02-08-2022', 'pre_val':70, 'cur_val':100},{'date':'01-08-2022', 'pre_val':60, 'cur_val':50}]

I would like to add all the duplicate day's values

bar = [{'date':'01-08-2022', 'pre_val':150, 'cur_val':150},{'date':'02-08-2022', 'pre_val':70, 'cur_val':100}]

Can anyone help me with this?

3 Answers
foo = [{'date':'01-08-2022', 'pre_val':90, 'cur_val':100},
    {'date':'02-08-2022', 'pre_val':70, 'cur_val':100},
    {'date':'01-08-2022', 'pre_val':60, 'cur_val':50}]
bar = []
for i in foo:
    date, pre_val, cur_val = i.values()
    isupdate = False
    for d in bar:
        if d["date"] == date:
            d1 = {'pre_val':d["pre_val"] + pre_val, 
                'cur_val':d["cur_val"] + cur_val}
            d.update(d1)
            isupdate = True
    if not isupdate:
        bar.append(i)

Output:

[{'date': '01-08-2022', 'pre_val': 150, 'cur_val': 150}, {'date': '02-08-2022', 'pre_val': 70, 'cur_val': 100}]

This can be easily achieved without the need for additional module imports as follows:

foo = [{'date': '01-08-2022', 'pre_val': 90, 'cur_val': 100},
       {'date': '02-08-2022', 'pre_val': 70, 'cur_val': 100},
       {'date': '01-08-2022', 'pre_val': 60, 'cur_val': 50}]

bar = []

for f in foo:
    _date = f['date']
    for b in bar:
        if _date == b['date']:
            for k in 'pre_val', 'cur_val':
                b[k] += f[k]
            break
    else:
        bar.append(f)

print(bar)

Output:

[{'date': '01-08-2022', 'pre_val': 150, 'cur_val': 150}, {'date': '02-08-2022', 'pre_val': 70, 'cur_val': 100}]

This can be very easily done using pandas grouping operations:

import pandas as pd
data = [{'date':'01-08-2022', 'pre_val':90, 'cur_val':100},{'date':'02-08-2022', 'pre_val':70, 'cur_val':100},{'date':'01-08-2022', 'pre_val':60, 'cur_val':50}]
df = pd.DataFrame(data)
>>          date  pre_val  cur_val
>> 0  01-08-2022       90      100
>> 1  02-08-2022       70      100
>> 2  01-08-2022       60       50

df2 = df.groupby("date") \
  .agg( \
       pre_val=("pre_val", sum), \
       cur_val=("cur_val", sum), \
      ) \
  .reset_index()
>>          date  pre_val  cur_val
>> 0  01-08-2022      150      150
>> 1  02-08-2022       70      100

df2.set_index("date").T.to_dict()
>> {'01-08-2022': {'pre_val': 150, 'cur_val': 150}, '02-08-2022': {'pre_val': 70, 'cur_val': 100}}
Related