如何使用列表推导获得此列表的累积总和:
list_comp=[1,4,9,16]
这是我尝试的内容,但它会打印列表中每个项目的两倍
print([x+x for x in list_comp])
我希望结果如下: list_comp = [1,5,14,30] 但是我得到了这个:
>> [2, 8, 18, 32]
答案 0 :(得分:8)
列表推导用于映射或过滤列表。他们不能有一个内部状态,这是你需要有效地做到这一点。
但是在Python 3中有itertools.accumulate
:
import itertools
print(list(itertools.accumulate([1, 4, 9, 16]))) # [1,5,14,30]
答案 1 :(得分:2)
你可以通过组合切片和列表理解来这样做,但是有效地做累积求和是笨拙的。
comp=[1,4,9,16]
[sum(comp[:idx+1]) for idx in range(len(comp))]
我不建议使用此功能,重新计算总和n次!
正确的方法可以这样做:
def cumsum(seq):
cumulative = [seq[0]]
for elt in seq[1:]:
cumulative.append(cumulative[-1] + elt)
return cumulative
itertools.accumulate
是@NielsWerner演示的另一种方式。
使用numpy
库以及此库的cumsum
函数可以找到更高的效率。
答案 2 :(得分:1)
海象操作员可以帮助解决这个任务:
lst = [1,4,9,16] # expected result: [1,5,14,30]
buf = 0
res = [buf := buf + num for num in lst]
print(res)
[注:海象运算符是在python 3.8中引入的]
答案 3 :(得分:0)
import numpy as np
a = [1,4,9,16]
b = np.cumsum(a)
print(list(b))
答案 4 :(得分:0)
如果您使用的是Python 2,我想再添加一种方法:
def cumulative_sum(seq):
prev = 0
result = []
for item in seq:
result.append(prev+item)
prev += item
return result
对于Python 3我建议使用内置方法itertools.accumulate
答案 5 :(得分:0)
您可以尝试...
list_comp=[1,4,9,16]
b=[sum(list_comp[0:x+1]) for x in range(0,len(list_comp))]
print(b)