我有一个整数列表:
x = [3, 5, 2, 7]
我想创建一个新列表,其中nth
元素是x
中从0
到n-1
的元素总和。
这将导致:
y = [0, 3, 8, 10]
如何在不运行循环的情况下使用列表理解来完成此操作?
答案 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]