基于循环索引在Python中对列表求和

时间:2015-03-26 01:53:16

标签: python list python-2.7

我有一个包含数字的列表,我希望对该列表的不同部分(按连续顺序)求和,并将这些值存储在新列表中。

示例:

a = [0, 1, 2, 3, 4, 5]
b = []
b.append(a[0])
b.append(a[0] + a[1])
b.append(a[0] + a[1] + a[2])

当然我的列表要长得多,所以我认为我需要一个for循环,但我不确定如何继续。

4 个答案:

答案 0 :(得分:6)

您可以使用简单的list comprehensionslicingsum功能,就像这样

>>> a = [0, 1, 2, 3, 4, 5]
>>> [sum(a[:i + 1]) for i in xrange(len(a))]
[0, 1, 3, 6, 10, 15]

注意:正如paxdiablo和DSM所指出的那样,这种方法效率非常低,因为它必须找到之前一次又一次看到的所有数字的总和(例如,当你找到前4个元素的总和,你也可以计算前三个元素的总和,也可以隐式地计算2个元素的总和。因此,这不适合更大的列表。

解决此问题的最佳方法是将结果累积到一个临时变量中并将其存储在列表中

>>> result, temp = [], 0
>>> for item in a:
...     temp += item
...     result.append(temp)
...     
>>> result
[0, 1, 3, 6, 10, 15]

实际上,如果要迭代总和,如果实际列表非常大,那么你可以更好地将其作为generator function,就像这样

>>> def accumulate_sum(input_list):
...     temp = 0
...     for item in input_list:
...         temp += item
...         yield temp
...     

然后迭代它以逐个获取值,如此

>>> for item in accumulate_sum([0, 1, 2, 3, 4, 5]):
...     print(item)
...     
0
1
3
6
10
15

您还可以使用list功能获取整个列表,例如

>>> list(accumulate_sum([0, 1, 2, 3, 4, 5]))
[0, 1, 3, 6, 10, 15]

仅供参考,Python 3.2+有一个名为itertools.accumulate的函数,可以像这样使用

>>> from itertools import accumulate
>>> from operator import add
>>> a = [0, 1, 2, 3, 4, 5]
>>> list(accumulate(a, func=add))
[0, 1, 3, 6, 10, 15]

或者你可以传递你自己的函数,它将两个数字添加到accumulate,就像这样

>>> list(accumulate([0, 1, 2, 3, 4, 5], func=lambda x, y: x + y))
[0, 1, 3, 6, 10, 15]

答案 1 :(得分:2)

这称为累积和numpy中有一项功能:

>>> import numpy as np
>>> a = [0, 1, 2, 3, 4, 5]
>>> np.cumsum(a)
array([ 0,  1,  3,  6, 10, 15])

答案 2 :(得分:1)

a = range(6) # or however you want to generate your data
b = [a[0]] # start with first element so we always have a previous element in the loop
for v in a[1:]:
   b.append(v+b[-1]) # the last element of b contains the sum of all the previous numbers

答案 3 :(得分:0)

为什么不拿你的清单把它变成一个数组然后求和。代码看起来像这样:

    import numpy as np
    a = [0,1,2,3,4]
    b = np.array(a)
    c = []
    for i in range(len(a)):
        c.append(np.sum(b[0:i+1]))