Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 22, 2017 16:47:28

zahar
Зарегистрирован: 2013-07-15
Сообщения: 39
Репутация: +  3  -
Профиль   Отправить e-mail  

группировка и суммирование элементов списка

день добрый..подскажите как грамотно сделать. Есть список
lst = [(datetime.date(2017, 8, 21), 8160L), (datetime.date(2017, 8, 21), 4020L), (datetime.date(2017, 8, 22), 3540L)
надо сгруппировать по дате и суммировать второе значение. Те второй элемент по одинаковым датам нужно суммировать.

Офлайн

#2 Авг. 22, 2017 17:01:49

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

группировка и суммирование элементов списка

 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 Авг. 22, 2017 17:33:59

zahar
Зарегистрирован: 2013-07-15
Сообщения: 39
Репутация: +  3  -
Профиль   Отправить e-mail  

группировка и суммирование элементов списка

спасибо…будем разбираться

Офлайн

#4 Авг. 24, 2017 18:10:22

lubocka
Зарегистрирован: 2017-06-11
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

группировка и суммирование элементов списка

не могли бы немного описать эти 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)

Офлайн

#5 Авг. 24, 2017 23:15:04

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

группировка и суммирование элементов списка

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)

Отредактировано Stright (Авг. 24, 2017 23:15:26)

Офлайн

#6 Авг. 25, 2017 00:07:51

lubocka
Зарегистрирован: 2017-06-11
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

группировка и суммирование элементов списка

Круто! Вот теперь и я пойду разбираться. Спасибо!

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version