如何计算列表中的多个项目

时间:2019-01-12 18:47:10

标签: python dictionary counter

我有以下列表:

MoPubStreamAdPlacer

数据代表年,月,日,星期几,计数。

我想获取一周中每天的总计数的字典。像这样

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]]

我相信最好的方法是使用collections.Counter,如果我错了,请纠正我。我放弃了这本字典词典,但是无法解决问题

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

4 个答案:

答案 0 :(得分:3)

由于您想求和而不是计数,因此使用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})

在这一点上,如果您确定输入内容不会有无效的天数,则可以对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}

答案 1 :(得分:1)

如果像在输入数据中一样,您的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))

答案 2 :(得分:0)

您可以使用简单的循环来解决此问题。创建一个将每天的初始值设置为零的结果字典,然后逐步将其添加。

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}

答案 3 :(得分:0)

当您要求使用集合中的Counter时,您可以像这样使用它:

from collections import Counter

counter=Counter()

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

results=dict(counter)