用python对数字序列求和

用python对数字序列求和,python,python-3.x,Python,Python 3.x,嗨,我是编程新手,我不知道如何写一个循环,这个循环将扩展一个空列表,其中包含一个范围(1,21)内的先前数字的总和。所以列表应该是这样的(1,1+2,1+2+3等等) 要使其成为任何列表的通用项,请点击这里 l = [3,4,5,6,7,12] # or l = range(1, 21) print ([sum(l[:i]) for i in range(1,len(l)+1)]) #Output: #[3, 7, 12, 18, 25, 37] 要使其成为任何列表的通用项,请点击这里 l =

嗨,我是编程新手,我不知道如何写一个循环,这个循环将扩展一个空列表,其中包含一个范围(1,21)内的先前数字的总和。所以列表应该是这样的(1,1+2,1+2+3等等)

要使其成为任何列表的通用项,请点击这里

l = [3,4,5,6,7,12] # or l = range(1, 21)
print ([sum(l[:i]) for i in range(1,len(l)+1)])
#Output:
#[3, 7, 12, 18, 25, 37]
要使其成为任何列表的通用项,请点击这里

l = [3,4,5,6,7,12] # or l = range(1, 21)
print ([sum(l[:i]) for i in range(1,len(l)+1)])
#Output:
#[3, 7, 12, 18, 25, 37]
我在外部
for
循环中使用
1+1
,以防止列表开头出现
0
。我用一个总和来证明我认为它是
start+1
,而不是与1不同的起点

这不是实现这一点的最佳方法,但它非常有效,而且非常容易理解,只需使用简单的循环和
range()
。使用
sum()
和/或
reduce()
生成更好的解决方案是可能的,但这超出了问题的范围

我在外部
for
循环中使用
1+1
,以防止列表开头出现
0
。我用一个总和来证明我认为它是
start+1
,而不是与1不同的起点


这不是实现这一点的最佳方法,但它非常有效,而且非常容易理解,只需使用简单的循环和
range()
。使用
sum()
和/或
reduce()
生成更好的解决方案是可能的,但这超出了问题的范围。

您可以对该问题应用递归方法:

l = []

def expand(n):
    if n == 0:
        return 0
    else:
        item = n + expand(n - 1)
        l.append(item)
        return item

expand(21)
print l

[1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231]

您可以将递归方法应用于此问题:

l = []

def expand(n):
    if n == 0:
        return 0
    else:
        item = n + expand(n - 1)
        l.append(item)
        return item

expand(21)
print l

[1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231]
它被称为前缀和或累积和。使用
numpy
轻松完成,这是数值计算的事实标准

import numpy as np
data = range(1, 21)
print(np.cumsum(data))
它被称为前缀和或累积和。使用
numpy
轻松完成,这是数值计算的事实标准

import numpy as np
data = range(1, 21)
print(np.cumsum(data))

标准库的胜利

import itertools
x = range(1, 5)
list(itertools.accumulate(x))
这将产生:

[1, 3, 6, 10]

标准库的胜利

import itertools
x = range(1, 5)
list(itertools.accumulate(x))
这将产生:

[1, 3, 6, 10]


@米拉多洛:不,这是一个特例,允许特殊的解决方案。@StefanPochmann抱歉,你能详细说明一下吗?对我来说,这似乎是一个明显的重复,除非你使用给定序列形式的部分和,但这似乎是一个范围。@miradulo,另一个问题是针对一般情况的。输入可以是任何列表。这是一个特例。当然,你可以用另一个问题的答案来解决这个问题,但你不必这么做。例如,这种特殊性可能允许更简单的答案。@miradulo不确定“使用给定序列形式的部分和”是什么意思,顺便说一句。@StefanPochmann我不同意-除非OP进一步澄清,否则这不是这个问题的本质,但我可以看出你的来历。对于序列的部分和,我的意思是你可以使用这样一个事实,即这样一个列表中的第I个元素将是I(I+1)/2,而不是做一个常规的累加和,但无论如何它会慢一些。也许还有更聪明的办法。@miradulo不,这是一个特例,允许特殊的解决方案。@StefanPochmann抱歉,你能详细说明一下吗?对我来说,这似乎是一个明显的重复,除非你使用给定序列形式的部分和,但这似乎是一个范围。@miradulo,另一个问题是针对一般情况的。输入可以是任何列表。这是一个特例。当然,你可以用另一个问题的答案来解决这个问题,但你不必这么做。例如,这种特殊性可能允许更简单的答案。@miradulo不确定“使用给定序列形式的部分和”是什么意思,顺便说一句。@StefanPochmann我不同意-除非OP进一步澄清,否则这不是这个问题的本质,但我可以看出你的来历。对于序列的部分和,我的意思是你可以使用这样一个事实,即这样一个列表中的第I个元素将是I(I+1)/2,而不是做一个常规的累加和,但无论如何它会慢一些。也许还有更聪明的方法。你说的“有效”是什么意思?我的意思是,如果有一个有效的输入,它会可靠地产生预期的结果。我在看这个泛型定义(),它在编程环境中是不正确的还是不完整的?“工作解决方案”是一个更合适的术语吗?我想你可以这么说,但听起来很奇怪。我想我从来没有见过在编程中使用它。我想强调的是,我的解决方案对于任何有效的输入都是正确的,尽管不是最好的解决方案。为了简单起见,我不想给人留下发布错误解决方案的印象,这可能是因为一条糟糕的评论。感谢您的反馈,我将尝试在未来的回答中更加清晰并避免重复信息。您所说的“有效”是什么意思?我的意思是,如果输入有效,它将可靠地产生预期结果。我在看这个泛型定义(),它在编程环境中是不正确的还是不完整的?“工作解决方案”是一个更合适的术语吗?我想你可以这么说,但听起来很奇怪。我想我从来没有见过在编程中使用它。我想强调的是,我的解决方案对于任何有效的输入都是正确的,尽管不是最好的解决方案。为了简单起见,我不想给人留下发布错误解决方案的印象,这可能是因为一条糟糕的评论。感谢您的反馈,我将尝试更清晰,并在将来的回答中避免重复信息。如果您更改
l
的下限或使用完全不同的列表,例如
l=[8,4,2]
,这将不起作用。我建议第二次使用
range
[sum(l[:I+1])来表示范围内的I(len(l))
@Arthur Tacca-我的解决方案基于OP的输入和预期输出:)好吧,这里有另一种有效的方法:
结果=[1,3,6,10,
(你明白了):-)我的评论给出了与您的答案相同的结果,但在我看来更清楚一点,因为它没有使用列表中的值