如果列表中的字典对象基于两个或多个项目重复,那么这两个对象应该通过对项目进行算术运算来合并。
示例 ->"客户"和"ID"项重复。"用法"项应添加结果对象。
如果结果对象中应保留第一个"国家/地区代码"(如果它不同(。
输入:
[
{
"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
}
]
我建议您使用第三方库(如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
方式更干净,更容易适应。
不错的小练习!
这是我的看法。我们需要对列表进行排序,然后比较对:
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}]