Найти - Пользователи
Полная версия: Группировка по значению в list, содержащем dict-ы
Начало » Python для новичков » Группировка по значению в list, содержащем dict-ы
1
Vort
Доброго времени суток
Вопрос возможно простой, но опыта в 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)

Возможно я просто неверно понимаю этот механизм, был бы благодарен за совет, как это лучше сделать.
Заранее спасибо.
terabayt
>>> 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'}]
FishHook
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
Vort
Спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB