从元组列表创建频率字典

时间:2014-10-23 09:37:42

标签: python list tuples histogram frequency

我有

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}

感谢

4 个答案:

答案 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,如果不是,则为可选参数。