繁体   English   中英

如何使用列表理解连续在列表中添加值?

[英]How to add values in a list successively using 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)

您正在寻找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版本<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版本> 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]

您可以将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]

应该这样做:

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

如果要使用列表推导来执行此操作,而又不导入任何模块,则可以使用以下代码来执行:

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]

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

您也可以通过使用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]

添加此答案只是该问题的另一种解决方案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM