Добавить значения для словаря с одинаковыми ключом и парой значений - PullRequest
0 голосов
/ 02 ноября 2019

Я хочу объединить список словарей на основе одной пары ключ-значение. У меня есть список словарей как

[{'id':1, 'total':100,'free_from':250},{'id':2,....},{'id':1,......}]

Я хочу создать из этого списка новый словарь с той же структурой, но если идентификатор одинаков для двух словарей, их общее количество должно быть добавлено вместо добавления словаря в новыйlist.

Это список словарей

products = [{'id':1,'total':20,'free_from':250,},{'id':2,'total':30,'free_from':150},{'id':1,'total':10,'free_from':250,},{'id':1,'total':10,'free_from':250},{'id':2,'total':40,'free_from':150, }]

, ожидаемый результат -

[{ 'id': 1,'total': 40, 'free_from': 250}, {'id': 2,'total': 70, 'free_from': 150}]

Мне удалось добиться этого с помощью следующего метода. Но было бы очень полезно, если бы кто-нибудь помог мне найти лучший способ сделать это.

category_delivery_list=[]
products = [
    {
        'id':1,
        'total':20,
        'free_from':250,
    },{
        'id':2,
        'total':30,
        'free_from':150, 
    },{
        'id':1,
        'total':10,
        'free_from':250, 
    },{
        'id':1,
        'total':10,
        'free_from':250, 
    },{
        'id':2,
        'total':40,
        'free_from':150, 
    }
]
for data in products:
    if category_delivery_list:
        index = None
        for count, cat in enumerate(category_delivery_list):
            if cat['id'] == data['id']:
                index=count
        if index >= 0:
            category_delivery_list[index]['total'] += data['total']
            category_delivery_list[index]['free_from'] = data['free_from']
        else:
            category_delivery_list.append({
                'id':data['id'],
                'total':data['total'],
                'free_from':data['free_from']
            })
    else:
        category_delivery_list.append({
            'id':data['id'],
            'total':data['total'],
            'free_from':data['free_from']
        })
print(category_delivery_list)

1 Ответ

0 голосов
/ 02 ноября 2019

Хороший способ сделать это - через временный словарь:

temp = {}
for data in products:
    if data["id"] in temp:
        temp[data["id"]]["total"] += data["total"]
        temp[data["id"]]["free_from"] += data["free_from"]
    else:
        temp[data["id"]] = data.copy()
category_delivery_list = list(temp.values)

Это создаст временный словарь id -> {'id':.., 'total':..., 'free_from':...}, затем перебирает список и добавляет новую запись или добавляетк существующей записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...