0

对于范围内的 i(1, len(A)):A[i] = A[i-1] + A[i]

4

5 回答 5

2

你不能用列表理解来做到这一点,因为它们不允许分配。

您可以使用一个简单的生成器函数:

def func(lis):
    yield lis[0]
    for i,x in enumerate(lis[1:],1):
        lis[i] = lis[i-1] + x
        yield lis[i]

>>> A = [1, 2, 3, 4, 5, 6, 7]
>>> list(func(A))
[1, 3, 6, 10, 15, 21, 28]
于 2013-06-05T04:49:39.820 回答
1

尽管效率较低,但这确实提供了所需的输出。但我认为我越来越接近这个 O(n**2) 了。

A = [sum(A[:i+1]) for i, _ in enumerate(A)]

afaik 这不能以您想要的方式通过列表理解来完成。我建议使用您提供的 for 循环版本。即使可以通过列表理解来实现,也没有必要在适当的位置修改列表。

于 2013-06-05T05:00:05.187 回答
0

这应该可以解决问题。

def func(L):
    it =  iter(L)
    v = it.next()
    yield v
    for x in it:
        v += x
        yield v

A = [1, 2, 3, 4, 5, 6, 7]     
print list(func(A))

这将创建一个迭代器,该迭代器一次返回一个值。要立即获取完整的新列表,您需要在函数调用周围使用 list() 调用,例如:

list(func(A))

此生成器函数应该适用于任何可迭代对象(以及那些不支持基于索引获取值的对象,例如 L[0])

我认为没有一种有效的方法可以通过理解列表来做到这一点。

于 2013-06-05T05:01:49.543 回答
0

使用 B(另一个临时变量)。

于 2013-06-05T05:03:35.517 回答
0

单线解决方案使用reduce

>>> the_list = [1,2,3,4,5]
>>> reduce(lambda result, x: result+[result[-1] + x] ,the_list, [0])[1:]
[1, 3, 6, 10, 15]
于 2013-06-05T05:22:08.747 回答