对列表中的字典对象项的操作(如果发现重复项)



如果列表中的字典对象基于两个或多个项目重复,那么这两个对象应该通过对项目进行算术运算来合并。

示例 ->"客户"和"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}]

最新更新