我有
d = [(4, 1), (4, 1), (4, 1), (4, 1), (4, 3), (4, 2), (4, 2), (4, 4), (4, 1), (4, 3), (4, 1), (4, 1), (4, 2), (4, 1)]
但是要大很多倍。
每个元组中的第一个数字是月份,第二个是事件数量。我需要将每个月的事件数量相加,并编制每个月的事件总数。 到目前为止我有:
def histogram(L):
y = {}
for x in L:
if x[0] in y.keys():
y[x] = y[x] + x[1]
else:
y[x] = x[1]
return y
我需要类似的输出 y = {4 = 24}(它不一定是字典) 但由于列表d的范围非常广泛,因此具有一系列数字
当前输出
{(4, 2): 2, (4, 4): 4, (4, 1): 1, (4, 3): 3}
感谢
答案 0 :(得分:2)
您可以使用Counter。我还为你的例子添加了一些额外的数据。
d = [(4, 1), (4, 1), (4, 1), (4, 1), (4, 3), (4, 2), (4, 2), (4, 4), (4, 1), (4, 3), (4, 1), (4, 1), (4, 2), (4, 1), (5,1), (5,2)]
from collections import Counter
counter = Counter()
for x, y in d:
counter[x]+=y
然后counter == Counter({4: 49, 5: 3})
答案 1 :(得分:1)
您可以在此处使用itertools.groupby
和dict-comprehension(考虑数据按月分类):
>>> from operator import itemgetter
>>> from itertools import groupby
>>> {k: sum(x for _, x in g) for k, g in groupby(d, key=itemgetter(0))}
{4: 24}
为了改善您的代码,您应该首先删除.keys()
调用(虽然这里不重要,因为我们只能有12个月),因为简单key in dct
搜索关键在O(1)时间。另一个问题是您使用x
作为密钥,但您应该使用x[1]
作为密钥:
def histogram(L):
y = {}
for m, c in L: #take the advantage of tuple unpacking
y[m] = y.get(m, 0) + c
如果你确定自己总是需要在你的dict中全部12个月,那么先将所有月份初始化:
def histogram(L):
y = dict.fromkeys(range(1, 13), 0)
for m, c in L:
y[m] += c
答案 2 :(得分:0)
这应该解决它。
d = [(4,1),(4,1),(4,1),(4,1),(4,3),(4,2),(4,2),(4 ,4),(4,1),(4,3),(4,1),(4,1),(4,2),(4,1)]
def直方图(L): y = {} 对于L:
month = t[0]
freq = t[1]
try :
y[month] += freq
except KeyError:
y[month] = 0
y[month] += freq
返回y
打印(直方图(d))
答案 3 :(得分:0)
我改变了你的变量名称
incidents = [(4, 1), (4, 1), (4, 1), (4, 1),
(4, 3), (4, 2), (4, 2), (4, 4),
(4, 1), (4, 3), (4, 1), (4, 1),
(4, 2), (4, 1)]
inc_by_m = {}
for m, n in incidents:
inc_by_m[m] = inc_by_m.get(m,0)+n
print inc_by_m
# {4:24}
简单的代码基于字典的0
方法的可选参数(此处为.get()
),get
返回由必需参数索引的值(如果之前是set,如果不是,则为可选参数。