遍历列表元素以获得累计和

Loop through list elements to get cumulative sums

我是 python 的新手。我正在尝试创建一个循环,以便我可以获得列表中元素的累计和。例如,给定一个列表 [3, 2, 1] 我希望得到 [3 (第一个数字), 5 (3+2), 6 (3+2+1)], [2 (第二个数字), 3 (2+1)] 和 [1].

我目前拥有的是:

data = [5, 4, 3, 2, 1]
for i in data:
    perf = [sum(data[:i+1]) for i in range(len(data))]
    print(perf)

我得到以下输出,这是第一个元素的总和。如何修改以获取以 4, 3, ... 开头的累计和?

[5, 9, 12, 14, 15]
[5, 9, 12, 14, 15]
[5, 9, 12, 14, 15]
[5, 9, 12, 14, 15]
[5, 9, 12, 14, 15]

我想要的输出

[5, 9, 12, 14, 15]
[4, 7, 9, 10]
[3, 5, 6]
[2, 3]
[1]

谢谢!

这里有 2 种方法可以解决这个问题。

data = [5, 4, 3, 2, 1]

k = 0;
for i in data:
    k = k + i
print(k)

这是第二种方法

data = [5, 4, 3, 2, 1]

k = 0;
for i in range(len(data)):
    k = k + data[i]
print(k)

如果我没理解错的话,在第 1 次迭代中,您想从第一个元素求和,在第 2 次迭代中,从第二个元素求和,依此类推:

data = [5, 4, 3, 2, 1]
for i in range(len(data)):
    s = 0
    l = [s := s + d for d in data[i:]]
    print(l)

打印:

[5, 9, 12, 14, 15]
[4, 7, 9, 10]
[3, 5, 6]
[2, 3]
[1]

或者:使用itertools.accumulate

from itertools import accumulate

data = [5, 4, 3, 2, 1]
for i in range(len(data)):
    print(list(accumulate(data[i:])))

你离答案不远了。您只需要从列表中的下一个数字开始您的范围。试试这个:

data = [5, 4, 3, 2, 1]
for ind, num in enumerate(data):
    perf = [sum(data[ind:i+1]) for i in range(ind, len(data))]
    print(perf)

输出:

[5, 9, 12, 14, 15]
[4, 7, 9, 10]
[3, 5, 6]
[2, 3]
[1]

你在循环内计算交换和的说法是正确的。 您刚刚在外循环语句中错误地使用了 i

您需要做的就是对原始数据进行切片并为每个切片生成总和。

test_data = [5, 4, 3, 2, 1]

def commulative_sum(a_list: list[int]):
    # The same thing you wrote
    return [sum(a_list[:i+1]) for i in range(len(a_list))]

def commulative_sums(data: list[int]):
    # Slice the input data and generate commulative sums
    return [commulative_sum(data[j:]) for j in range(len(data))]

result = commulative_sums(test_data)
print(result)

[[5, 9, 12, 14, 15], [4, 7, 9, 10], [3, 5, 6], [2, 3], [1]]