Как посчитать несколько элементов в списке - PullRequest
0 голосов
/ 12 января 2019

У меня есть следующий список:

data = [[2004,1,1,1,50], [2008,2,28,1,150],[1984,5,1,3,20],[1982,5,1,7,20], [1982,5,8,7,20]]

Данные представляют год, месяц, день, день недели, количество.

Я хочу получить словарь общего количества за день недели. Как то так

results = {1:200,
           2:0,
           3:20,
           4:0,
           5:0,
           6:0,
           7:40,
}

Я считаю, что лучший способ сделать это, пожалуйста, поправьте меня, если я ошибаюсь, - это использовать коллекции. Счетчик. Я отказался от этих усилий для понимания словаря, но не смог решить проблему

solution = {(x,i) for x[3], i[4] in data}

Ответы [ 4 ]

0 голосов
/ 12 января 2019

Поскольку вы просили использовать Counter из коллекций, вы можете использовать его следующим образом:

from collections import Counter

counter=Counter()

for group in data:
    counter[group[3]] +=group[4]

results=dict(counter)
0 голосов
/ 12 января 2019

Вместо этого вы можете решить эту проблему с помощью простого цикла. Создайте диктофон результатов с начальными значениями для каждого дня, установленного на ноль, и просто добавляйте к нему шаг за шагом.

results = {k:0 for k in range(1,8)}
#Output: {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0}
data = [[2004,1,1,1,50], [2008,2,30,1,150],[1984,5,1,3,20],[1982,5,1,7,20], [1982,5,8,7,20]]

for x in data:
    results[x[3]] += x[4]

print(results)
#Output:
{1: 200, 2: 0, 3: 20, 4: 0, 5: 0, 6: 0, 7: 40}
0 голосов
/ 12 января 2019

Если, как и в ваших входных данных, ваш data отсортирован по дню недели, т.е. все подсписки для определенного дня недели смежны друг с другом, вы можете использовать itertools.groupby с словарное понимание:

from itertools import groupby
from operator import itemgetter

res = {k: sum(map(itemgetter(-1), v)) for k, v in groupby(data, key=itemgetter(-2))}

print(res)
# {1: 200, 3: 20, 7: 40}

Если ваши данные не отсортированы, вам придется отсортировать по дням недели сначала :

data = sorted(data, key=itemgetter(-2))
0 голосов
/ 12 января 2019

Поскольку вы хотите суммировать, а не считать, может быть проще использовать defaultdict:

from collections import defaultdict

data = [[2004,1,1,1,50], [2008,2,30,1,150],[1984,5,1,3,20],[1982,5,1,7,20], [1982,5,8,7,20]]

c = defaultdict(int)

for l in data:
    c[l[3]] += l[4]

print(c)
# defaultdict(<class 'int'>, {1: 200, 3: 20, 7: 40})

Если вы настаиваете на нулевых записях, вы можете создать его раньше:

from collections import defaultdict

data = [[2004,1,1,1,50], [2008,2,30,1,150],[1984,5,1,3,20],[1982,5,1,7,20], [1982,5,8,7,20]]

c = defaultdict(int)
c.update({d: 0 for d in range(1, 8)})
for l in data:
    c[l[3]] += l[4]
print(c)
# defaultdict(<class 'int'>, {1: 200, 2: 0, 3: 20, 4: 0, 5: 0, 6: 0, 7: 40})

В этот момент вы можете использовать обычный dict сверх defaultdict, если вы уверены, что у ввода не будет недопустимых дней:

data = [[2004,1,1,1,50], [2008,2,30,1,150],[1984,5,1,3,20],[1982,5,1,7,20], [1982,5,8,7,20]]

c = {d: 0 for d in range(1, 8)} # or dict.fromkeys(range(1, 8), 0)
for l in data:
    c[l[3]] += l[4]
print(c)
# {1: 200, 2: 0, 3: 20, 4: 0, 5: 0, 6: 0, 7: 40}
...