Найти - Пользователи
Полная версия: группировка и суммирование элементов списка
Начало » Python для новичков » группировка и суммирование элементов списка
1
zahar
день добрый..подскажите как грамотно сделать. Есть список
lst = [(datetime.date(2017, 8, 21), 8160L), (datetime.date(2017, 8, 21), 4020L), (datetime.date(2017, 8, 22), 3540L)
надо сгруппировать по дате и суммировать второе значение. Те второй элемент по одинаковым датам нужно суммировать.
Stright
 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))
zahar
спасибо…будем разбираться
lubocka
не могли бы немного описать эти 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))])

и если добавляю поле в список, выдает ошибку.
Как просуммировать 2 и более столбика, и по 2-м и более позициям фильтра,
например такой список:
профильтровать по дате и имени и просуммировать 2 последних столбца
(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)
Stright
Groupby группирует последовательности по определенному признаку. Список состоит из кортежей, первым элементом, которых является дата, по которой и надо сгруппировать эти кортежи. Этот признак мы и передаем в параметре key, нулевой элемент кортежа, т. е. дату (
 x[0]
). groupby возвращает итератор, проходя по которому мы может получить ключ для каждой группы (дату) и group - итератор, со всеми элементами, попавшими в группу (сами кортежи с этой датой). Предварительно последовательность должна быть отсортирована по этому же ключу.
В вашем случае нужно использовать
 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)
lubocka
Круто! Вот теперь и я пойду разбираться. Спасибо!
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