如何使用列表理解来计算总和

时间:2017-12-02 11:15:57

标签: python python-3.x list list-comprehension

如何使用列表推导获得此列表的累积总和:

list_comp=[1,4,9,16] 

这是我尝试的内容,但它会打印列表中每个项目的两倍

print([x+x for x in list_comp])

我希望结果如下: list_comp = [1,5,14,30] 但是我得到了这个:

>> [2, 8, 18, 32]

6 个答案:

答案 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)