Доброго денька, други.
Есть некий список o_money. Там лежат данные по заказам, подзаказам, счетам и еще много всякой лабудени(нужной). В том числе в каждой строчке есть название "клиента".
Захотелось сделать отчет, который суммирует все строки, относящиеся к одному клиенту(изначально набор идет по номеру "сделки"). Короче, регруп с подсчетами сумм.
Как обычно, решение было решено сделать тупо:
client_sums = {}
for item in o_money:
a = item['order__client__name_rus']
if not item['order__client__name_rus'] in client_sums.keys():
client_sums[item['order__client__name_rus']] = {}
for k, v in item.iteritems():
client_sums[item['order__client__name_rus']][k]=v
else:
client_sums[item['order__client__name_rus']][k]=client_sums[item['order__client__name_rus']][k]+v
Но так же не интересно. Возникли вопросы:
-
а не сократить ли это все до одной строчки? Я не смог :(((
-
а нет ли встроенных функций, призванных делать такое же?
Максимум, до чего удалось сократить, получилось таким:
client_sums= {}
from itertools import groupby
from collections import Counter
from operator import add
for key, group in groupby(o_money, key=lambda x: x['order__client__name_rus']):
client_sums[key] = reduce(add, (Counter(dict(x)) for x in group))
Но этот вариант некорректно обрабатывает отрицательные значения. Голова уже вскипела, так что тьфу... В связи с этим вопрос 3:
- а нужно ли вообще запариваться?
Updated 13 Jan. 2015, 20:52 by Ski.