Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 14, 2015 16:47:41

Vort
Зарегистрирован: 2014-01-09
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Группировка по значению в list, содержащем dict-ы

Доброго времени суток
Вопрос возможно простой, но опыта в Python/Django у меня мало, и почему-то сходу решение не нашлось, буду благодарен за совет.

Есть такой list из dict-ов

[
     {'product_id': '1', 'quantity': '1'},
     {'product_id': '1', 'quantity': '1'},
     {'product_id': '2', 'quantity': '1'},
     {'product_id': '1', 'quantity': '1'}
]

Нужно сгруппировать их по значению ‘quantity’, сложив его, т.е. на выходе получить
[
    {'product_id': '1', 'quantity': '3'},
    {'product_id': '2', 'quantity': '1'}
]

Пытался сделать таким образом:
products_grouped = []
            for p in products:
                if p in products_grouped:
                    products_grouped[products_grouped.index(p)] = {
                        'product': Product.objects.get(id=p['product'].id),
                        'quantity': str(int(products_grouped[products_grouped.index(p)]['quantity']) + int(p['quantity']))
                    }
                else:
                    products_grouped.append(p)

Но почему-то конструкция in воспринимает dict, как входящий в list только вхождения первого элемента идущие подряд, а после прохода по другому элементу, следующий (такой же как первые два) - воспринимает как уже новый (p in products_grouped == False)

Возможно я просто неверно понимаю этот механизм, был бы благодарен за совет, как это лучше сделать.
Заранее спасибо.

Офлайн

#2 Июнь 14, 2015 17:22:37

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Группировка по значению в list, содержащем dict-ы

>>> a = [
...      {'product_id': '1', 'quantity': '1'},
...      {'product_id': '1', 'quantity': '1'},
...      {'product_id': '2', 'quantity': '1'},
...      {'product_id': '1', 'quantity': '1'}
... ]
>>> b = {}
>>> for i in a:
...     b[i['product_id']] = int(i['quantity']) + b.get(i['product_id'], 0)
... 
>>> print b
{'1': 3, '2': 1}
>>> print [{'product_id': i, 'quantity': str(j)} for i, j in b.items()]
[{'product_id': '1', 'quantity': '3'}, {'product_id': '2', 'quantity': '1'}]



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Июнь 14, 2015 17:24:32)

Офлайн

#3 Июнь 14, 2015 17:33:18

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Группировка по значению в list, содержащем dict-ы

from collections import defaultdict
lst = [
     {'product_id': '1', 'quantity': '1'},
     {'product_id': '1', 'quantity': '1'},
     {'product_id': '2', 'quantity': '1'},
     {'product_id': '1', 'quantity': '1'}
]
res = defaultdict(int)
for dct in lst:
    res[dct["product_id"]] += int(dct["quantity"])
res = [{'product_id': k, 'quantity': str(v)} for k, v in res.iteritems()]
print res



Офлайн

#4 Июнь 14, 2015 18:13:55

Vort
Зарегистрирован: 2014-01-09
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Группировка по значению в list, содержащем dict-ы

Спасибо.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version