累积元组列表中的项目

use*_*853 5 python python-2.6

我有一个看起来像这样的元组列表:

lst = [(0, 0), (2, 3), (4, 3), (5, 1)]
Run Code Online (Sandbox Code Playgroud)

积累第一个和第二个元组元素之和的最佳方法是什么?使用上面的示例,我正在寻找生成此列表的最佳方法:

new_lst = [(0, 0), (2, 3), (6, 6), (11, 7)]
Run Code Online (Sandbox Code Playgroud)

我正在寻找Python 2.6中的解决方案

Gar*_*tty 13

我认为最好的解决方案是itertools.accumulate()累积值,并使用zip()拆分列并将它们合并.这意味着生成器只处理单个列,并使该方法完全可伸缩.

>>> from itertools import accumulate
>>> lst = [(0, 0), (2, 3), (4, 3), (5, 1)]
>>> list(zip(*map(accumulate, zip(*lst))))
[(0, 0), (2, 3), (6, 6), (11, 7)]
Run Code Online (Sandbox Code Playgroud)

我们zip()用来取列,然后应用于itertools.accumulate()每一列,然后用zip()它们将它们合并回原始格式.

此方法适用于任何可迭代的,而不仅仅是序列,并且应该相对有效.

在3.2之前,累积可以定义为:

def accumulate(iterator):
    total = 0
    for item in iterator:
        total += item
        yield total
Run Code Online (Sandbox Code Playgroud)

(文档页面提供了更通用的实现,但对于这个用例,我们可以使用这个简单的实现).