从元组列表创建频率字典

0 投票
4 回答
817 浏览
提问于 2025-04-29 05:28

我有一个数据:

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

我稍微改了一下你变量的名字

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() 方法会根据你提供的必需参数来返回对应的值。如果这个值之前已经设置过,就返回这个值;如果没有设置过,就返回你提供的可选参数。

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

定义一个叫做histogram的函数,接收一个列表L:

y = {} # 这里创建了一个空的字典,用来存放结果

接下来,代码会遍历列表L中的每一个元素:

month = t[0]
freq = t[1]
try :
  y[month] += freq
except KeyError:
  y[month] = 0
  y[month] += freq

最后,返回这个字典y,里面存的是处理后的结果。

然后,打印出histogram函数处理d这个列表的结果。

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

你可以使用 itertools.groupby 和字典推导式来处理这个问题(假设数据是按月份排序的):

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

如果你确定字典里总是需要包含所有12个月,那就先初始化所有的月份:

def histogram(L):
    y = dict.fromkeys(range(1, 13), 0)
    for m, c in L:          
        y[m] += c

撰写回答