如何使用列表推导连续添加列表中的值?

时间:2018-03-06 06:23:43

标签: python list-comprehension

我想连续在列表中添加值。 有没有办法通过使用列表理解来做到这一点?

input_list = [1,2,3,4,5,6]
expected_list = [1,3,6,10,15,21]

这可以通过此功能

完成
def add_list(input_list):
    required_list =[input_list[0]]
    for item in range(1,len(input_list)):
        required_list.append(required_list[-1] + input_list[item])
    return (required_list)

5 个答案:

答案 0 :(得分:7)

您正在寻找accumulate功能。 Python 3.2及更高版本的itertools模块中提供了此功能。如果您使用的是python< 3.2你可以像这样编写自己的函数。

# myscript.py
import operator


def accumulate(iterable, func=operator.add):
    """
    Return an iterator whose items are the accumulated results of a function
    (specified by the optional *func* argument) that takes two arguments.
    By default, returns accumulated sums with :func:`operator.add`.
    """
    it = iter(iterable)
    try:
        total = next(it)
    except StopIteration:
        return
    else:
        yield total

    for element in it:
        total = func(total, element)
        yield total

<强>样本

1)Python版本&lt; 3.2(使用您自己的功能)

>> from myscript import accumulate
>> print list(accumulate([1, 2, 3, 4, 5, 6])) # Running sum
>> [1,3,6,10,15,21]

使用列表理解。

>> from myscript import accumulate
>> out_ = [item for item in accumulate([1, 2, 3, 4, 5, 6])] 
>> out_
>> [1,3,6,10,15,21]

2) Python版本&gt; 3.2(该功能已经在itertools模块中,只需使用它:))

 >> from itertools import accumulate
 >> print(list(accumulate([1, 2, 3, 4, 5, 6])))

使用列表理解。

 >> from itertools import accumulate
 >> out_ = [item for item in accumulate([1, 2, 3, 4, 5, 6])] 
 >> out_
 >> [1,3,6,10,15,21]

注意

如果您想查找累积的产品/部门/等,可以将相应的func参数传递给accumulate函数。

>> import operator
>> out_ = [item for item in accumulate([1, 2, 3], func=operator.mul)] # accumulated product.
>> out_
>> [1, 2, 6]

答案 1 :(得分:1)

您可以使用functools.reduce以及列表理解来获得结果。

>>> from functools import reduce

>>> items = [1,2,3,4,5,6]
>>> [reduce(lambda x,y: x+y, l[:b]) for b in range(1,len(l)+1)]
>>> [1, 3, 6, 10, 15, 21]

答案 2 :(得分:0)

这应该这样做:

import itertools
original_list = [1,2,3,4,5,6]
required_list = [bi for bi in itertools.accumulate(original_list)]
print(required_list)

答案 3 :(得分:0)

如果您想使用列表理解并且不导入任何模块,可以使用以下代码执行此操作:

original_list = [1,2,3,4,5,6]
required_list = [sum(original_list[:val]) for val in range(1,len(original_list)+1)]

输出:

[1, 3, 6, 10, 15, 21]

如果您有任何疑问,可以在下方发表评论。

答案 4 :(得分:0)

您也可以使用enumarate()

来完成此操作
a = [1,2,3,4,5,6]
b = [sum(a[:i[0]+1]) for i in enumerate(a)]
print b
[1, 3, 6, 10, 15, 21]

为此问题的另一个解决方案添加此答案