我有以下列表:
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,
}
答案 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)