如何在Python中对需要对第二个元素求和的元组列表执行groupby操作?

如何在Python中对需要对第二个元素求和的元组列表执行groupby操作?,python,group-by,Python,Group By,我有一个元组列表,比如: durations = [(1, 5), (2, 3), (1, 6), (3, 1), (3, 12), (7, 8)] 并希望对其执行groupby操作,该操作返回列表中每个元组的第二个元组元素的总和。我想要的输出如下所示(最好按第二个元组元素降序排列): 但是,当我尝试以下解决方案时: 我不断得到错误的输出: [(1, 5), (2, 3), (1, 6), (3, 13), (7, 8)] (在本例中,(1,5)和(1,6)加起来不等于(1,11)。在较大的

我有一个元组列表,比如:

durations = [(1, 5), (2, 3), (1, 6), (3, 1), (3, 12), (7, 8)]
并希望对其执行groupby操作,该操作返回列表中每个元组的第二个元组元素的总和。我想要的输出如下所示(最好按第二个元组元素降序排列):

但是,当我尝试以下解决方案时:

我不断得到错误的输出:

[(1, 5), (2, 3), (1, 6), (3, 13), (7, 8)]
(在本例中,(1,5)和(1,6)加起来不等于(1,11)。在较大的数据上运行此代码会导致大量此类未命中)


如何解决这个问题?

最简单的方法可能是使用dict作为累加器

from collections import defaultdict

def accumulate(l):
    d = defaultdict(int)
    for x in l:
       d[x[0]] += x[1]
    return d.items()

durations = [(1, 5), (2, 3), (1, 6), (3, 1), (3, 12), (7, 8)]

print(list(accumulate(durations)))

Martin没有注意到:“这要求列表按第一个键排序。如果它还没有排序,那么ghostdog74的defaultdict方法是一个更好的解决方案”是的,这很有效,谢谢!这里还提到:“通常情况下,iterable需要在同一个键函数上进行排序。”是的,谢谢您的评论!
[(1, 5), (2, 3), (1, 6), (3, 13), (7, 8)]
from collections import defaultdict

def accumulate(l):
    d = defaultdict(int)
    for x in l:
       d[x[0]] += x[1]
    return d.items()

durations = [(1, 5), (2, 3), (1, 6), (3, 1), (3, 12), (7, 8)]

print(list(accumulate(durations)))