如果找到重复,则对列表中的字典对象的项进行操作

时间:2018-05-23 09:40:31

标签: python json python-3.x dictionary

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

示例 - > '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
  }
]

2 个答案:

答案 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}]