如果列表中的字典对象基于两个或多个项目是重复的,则应通过对项目进行算术运算来合并这两个对象。
示例 - > 'CUSTOMER'和'ID'项目重复。应该在“USAGE”项目中添加结果对象。
如果不同,第一个'COUNTRY CODE'应保留在结果对象中。
输入:
[
{
"CUSTOMER": "XYZ",
"COUNTRY CODE": "US",
"ID": "Essential",
"USAGE": 500
},
{
"CUSTOMER": "XYZ",
"COUNTRY CODE": "US",
"ID": "Seats",
"USAGE": 20
},
{
"CUSTOMER": "XYZ",
"COUNTRY CODE": "FR",
"ID": "Essential",
"USAGE": 50
}
]
输出:
[
{
"CUSTOMER": "XYZ",
"COUNTRY": "US",
"ID": "Essential",
"USAGE": 550
},
{
"CUSTOMER": "XYZ",
"COUNTRY CODE": "US",
"ID": "Seats",
"USAGE": 20
}
]
答案 0 :(得分:2)
我建议您使用pandas
等第三方库来完成此任务。
给定词典列表J
,您可以执行groupby
,然后转换to_dict
。
import pandas as pd
res = pd.DataFrame(J).groupby(['CUSTOMER', 'ID'])\
.agg({'USAGE': 'sum', 'COUNTRY CODE': 'first'}).reset_index()\
.to_dict(orient='records')
print(res)
[{'COUNTRY CODE': 'US', 'CUSTOMER': 'XYZ', 'ID': 'Essential', 'USAGE': 550},
{'COUNTRY CODE': 'US', 'CUSTOMER': 'XYZ', 'ID': 'Seats', 'USAGE': 20}]
您还可以将collections.defaultdict
与一些混乱的if
语句一起使用。我认为pandas
方式更清晰,更容易适应。
答案 1 :(得分:0)
很棒的小运动!
这是我的看法。我们需要对列表进行排序,然后比较对:
customers.sort(key=lambda cust:cust['CUSTOMER'] + cust['ID'])
result = []
previous_cust = None
for cust in customers:
if not previous_cust: # first time though
previous_cust = cust
continue
if previous_cust['CUSTOMER'] == cust['CUSTOMER'] and\
previous_cust['ID'] == cust['ID']:
previous_cust['USAGE'] += cust['USAGE']
else:
result.append(previous_cust)
previous_cust = cust
result.append(previous_cust) # tidy up
result
给出:
[{'CUSTOMER': 'XYZ', 'COUNTRY CODE': 'US', 'ID': 'Essential', 'USAGE': 550},
{'CUSTOMER': 'XYZ', 'COUNTRY CODE': 'US', 'ID': 'Seats', 'USAGE': 20}]