对于范围内的 i(1, len(A)):A[i] = A[i-1] + A[i]
user2150774
问问题
72 次
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 回答