增量求和Python 2.7

时间:2015-10-03 17:27:47

标签: python python-2.7

my_list = [0, 219, 211, 212, 212]

我需要以这种方式对项目进行总结:

item + item,(item + item)+ item,(item + item + item)+ Item ...

0 + 219,(219)+211,(430)+212,(641)+212

为了更清楚,这是我需要得到的总和:

new_list = [219, 430, 641, 853]

我认为解决方案可能是列表理解,这样的事情只会返回每个项目与下一个项目的总和。

[(x + y) for (x, y) in zip(my_list[:-1], my_list[1:])]

任何想法?

2 个答案:

答案 0 :(得分:6)

您可以从Python 3中复制itertools.accumulate() documentation description

import operator

def accumulate(iterable, func=operator.add):
    'Return running totals'
    # accumulate([1,2,3,4,5]) --> 1 3 6 10 15
    # accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
    it = iter(iterable)
    try:
        total = next(it)
    except StopIteration:
        return
    yield total
    for element in it:
        total = func(total, element)
        yield total

这将汇总输入列表中的值,产生一个运行总计:

>>> my_list = [0, 219, 211, 212, 212]
>>> list(accumulate(my_list))
[0, 219, 430, 642, 854]

您可以根据具体情况定制模式,移除func自定义点并忽略第一个总数:

def accumulate(iterable):
    it = iter(iterable)
    try:
        total = next(it)
    except StopIteration:
        return
    for element in it:
        total += element
        yield total

现在它为4个输入产生3个值:

>>> list(accumulate(my_list))
[219, 430, 642, 854]

答案 1 :(得分:1)

......或类似的东西可能

b=0
b = [sum(a[:k]) for k in range(1+len(a))]

对于大型列表可能不会过于高效。

这个测试:

a = [7, 11, 24, 38]

b=0
b = [sum(a[:k]) for k in range(1+len(a))]

print(a)
print(b)

得到:

>>> ================================ RESTART ================================
>>> 
[7, 11, 24, 38]
[0, 7, 18, 42, 80]
>>> 

或者做Martijn建议并使用itertools。

[顺便说一句 - '去找一个要导入的库'的Python文化是否会破坏编码艺术?]