Операции над элементами словарного объекта в списке, если найден дубликат - PullRequest
0 голосов
/ 23 мая 2018

Если объект словаря в списке дублируется на основе двух или более элементов, то эти два объекта следует объединить, выполнив арифметическую операцию над элементами.

Пример -> Пункт «CUSTOMER» и «ID» создает дубликаты.Элемент 'USAGE' должен быть добавлен в результирующий объект.

Первый «КОД СТРАНЫ» должен быть сохранен в результирующем объекте, если он отличается.

Ввод:

[
  {
    "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 голосов
/ 23 мая 2018

Я рекомендую вам использовать стороннюю библиотеку, такую ​​как 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 способ чище и легче адаптируется.

0 голосов
/ 23 мая 2018

Хорошее маленькое упражнение!

Вот мой взгляд на это.Нам нужно отсортировать список, а затем сравнить пары:

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}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...