Форум сайта python.su
день добрый..подскажите как грамотно сделать. Есть список
lst = [(datetime.date(2017, 8, 21), 8160L), (datetime.date(2017, 8, 21), 4020L), (datetime.date(2017, 8, 22), 3540L)
надо сгруппировать по дате и суммировать второе значение. Те второй элемент по одинаковым датам нужно суммировать.
Офлайн
import datetime from itertools import groupby lst = [ (datetime.date(2017, 8, 21), 8160), (datetime.date(2017, 8, 21), 4020), (datetime.date(2017, 8, 22), 3540) ] def sum_by_date(lst): output = [] sorted_list = sorted(lst, key=lambda x: x[0]) for date, group in groupby(sorted_list, key=lambda x: x[0]): output.append([date, sum(number for date, number in list(group))]) return output print(sum_by_date(lst))
Офлайн
спасибо…будем разбираться
Офлайн
не могли бы немного описать эти 3 строчки:
sorted_list = sorted(lst, key=lambda x: x[0]) for date, group in groupby(sorted_list, key=lambda x: x[0]): output.append([date, sum(number for date, number in list(group))])
Офлайн
Groupby группирует последовательности по определенному признаку. Список состоит из кортежей, первым элементом, которых является дата, по которой и надо сгруппировать эти кортежи. Этот признак мы и передаем в параметре key, нулевой элемент кортежа, т. е. дату (
x[0]
key=lambda x: (x[0], x[1])
import datetime from itertools import groupby from pprint import pprint lst = [ (datetime.date(2017, 8, 21), 'Жека', 8160, 1160), (datetime.date(2017, 8, 21), 'Жека', 4020, 1160), (datetime.date(2017, 8, 20), 'Жека', 10160, 1160), (datetime.date(2017, 8, 20), 'Серега', 4020, 2000), (datetime.date(2017, 8, 20), 'Серега', 4020, 1150), (datetime.date(2017, 8, 22), 'Жека', 3540, 2000) ] sorted_list = sorted(lst, key=lambda x: (x[0], x[1])) output = [] for key, group in groupby(sorted_list, key=lambda x: (x[0], x[1])): values = list(group) output.append([*key, sum(i[2] for i in values), sum(i[3] for i in values)]) pprint(output)
Отредактировано Stright (Авг. 24, 2017 23:15:26)
Офлайн
Круто! Вот теперь и я пойду разбираться. Спасибо!
Офлайн