列表理解的累积和

时间:2015-06-05 22:24:26

标签: python

我有一个整数列表:

x = [3, 5, 2, 7]

我想创建一个新列表,其中nth元素是x中从0n-1的元素总和。

这将导致:

y = [0, 3, 8, 10]

如何在不运行循环的情况下使用列表理解来完成此操作?

4 个答案:

答案 0 :(得分:7)

没有循环而没有列表理解怎么样?可悲的是只有Python 3:

>>> x = [3, 5, 2, 7]
>>> from itertools import accumulate
>>> [0] + list(accumulate(x[:-1]))
[0, 3, 8, 10]

更新:这是一个O(n)列表理解解决方案:

>>> s = [0]
>>> [s.append(s[0]+n) or s.pop(0) for n in x]
[0, 3, 8, 10]

但我只是想表明这可能没有太多努力。我认为accumulate或for循环要好得多。

答案 1 :(得分:0)

如果你在列表上进行计算,你可能会更好地使用numpy:

import numpy as np
x = [3, 5, 2, 7]

print(np.cumsum([0]+x[:-1]).tolist())
[0, 3, 8, 10]

或者如果0无关紧要:

import numpy as np
x = np.array([3, 5, 2, 7])

print( x[:-1].cumsum())
[ 3  8 10]

如果你想要0:

,或者追加
import numpy as np
x = np.array([3, 5, 2, 7])
out = np.array(0)
print(np.append(out, x[:-1].cumsum()))
[0  3  8 10]

无论你做什么,总会有一个循环,我会更担心编写有效的代码而不是短代。

使用python2定期for循环会很有效:

x = [3, 5, 2, 7]

sm = 0
out = []
for ele in x:
    out.append(sm)
    sm += ele
print(out)
[0, 3, 8, 10]

答案 2 :(得分:0)

x = [3, 5, 2, 7]

cumsumx=[sum(x[:i] for i in range(len(x))]

答案 3 :(得分:0)

这提供了您所需要的:

x = [3, 5, 2, 7]
y = [sum(x[0:i]) for i,value in enumerate(x)]
[0, 3, 8, 10]