【发布时间】:2017-05-14 10:58:58
【问题描述】:
给定以下列表:
a=[1,2,3]
我想生成一个新列表,其中每个数字都是它和它之前的值的总和,如下所示:
result = [1,3,6]
逻辑:
1 没有前面的值,所以它保持不变。
3 是从第一个值 (1) 添加到列表中第二个数字的值 (2)
6 是前两个元素的 1 和 2 之和,加上第三个值 3。
提前致谢!
【问题讨论】:
标签: python numpy sum cumulative-sum
给定以下列表:
a=[1,2,3]
我想生成一个新列表,其中每个数字都是它和它之前的值的总和,如下所示:
result = [1,3,6]
逻辑:
1 没有前面的值,所以它保持不变。
3 是从第一个值 (1) 添加到列表中第二个数字的值 (2)
6 是前两个元素的 1 和 2 之和,加上第三个值 3。
提前致谢!
【问题讨论】:
标签: python numpy sum cumulative-sum
Python 3 有 itertools.accumulate 正是为了这个目的:
>>> from itertools import accumulate
>>> a=[1,2,3]
>>> list(accumulate(a))
[1, 3, 6]
【讨论】:
Python 对此有一个函数。
import itertools
result = list(itertools.accumlate([1, 2, 3]))
Python itertools 可以很好地解决一些问题,您应该花点时间仔细阅读它们。
【讨论】:
Avinash Raj 的代码无法正常工作。
a = [1,2,3]
b = [sum(a[:(i+1)]) for i, j in enumerate(a)]
print(b)
根据@Avinash Raj 编辑
【讨论】:
[sum(a[:i+1]) for i,j in enumerate(a)]
普通的循环怎么样?
a = [1,2,3]
result = []
s = 0
for item in a:
s += item
result.append(s)
print(result)
【讨论】:
大约有一百种不同的方法来计算这种累积和。根据您实际想要使用结果的目的,不太明显或不太通用的解决方案可能更节省时间或内存 - 尽管下面的简单解决方案是 O(1)内存和 O(N) 时间。
几乎所有命令式编程语言中最直接的过程方法都是这样的:
csum=0
result=[]
for val in a:
csum += val
result.append(csum)
Python 标准库还包括一个执行此操作的函数:itertools.accumulate。
import itertools
result = list(itertools.accumulate(a))
【讨论】:
如果你想要一个 numpy 解决方案
from numpy import cumsum
result = list(cumsum(a))
【讨论】:
试试这个..
def running_sum(a):
tot = 0
for item in a:
tot += item
yield tot
a = [1,2,3,4]
print list(running_sum(a))
【讨论】: