添加字典列表中的所有重复值



我有一个字典列表:

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 = [{'date':'01-08-2022', 'pre_val':150, 'cur_val':150},{'date':'02-08-2022', 'pre_val':70, 'cur_val':100}]

有人能帮我吗?

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)

输出:

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

这可以在不需要额外模块导入的情况下轻松实现,如下所示:

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)

输出:

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

使用pandas分组操作可以很容易地完成这一操作:

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

最新更新