迭代它们时理解列表/生成器的项目索引

时间:2014-11-13 01:49:25

标签: python

如何在iteratin中访问list-comprehension中生成的元素 通常我们会访问通过list[-1]添加的最后一个元素。

在生成器或理解列表的情况下,如何在迭代时获取元素

[<access to last element> added for i,item in enumerate(range(10))]

构建类似于:

的东西
    i=0
    l=[0]
    while i<10:
        newItem= 2*l[-1]
        l+=[newItem]
        i+=1

2 个答案:

答案 0 :(得分:1)

列表推导不提供此功能。为简单起见,它们仅支持使用真实for语句可以执行的操作的一小部分,并且此功能不在该子集中。如果你真的想,你可以使用像

这样丑陋的黑客
prev = [None]
l = [(prev.__setitem__(0, do_something_with(prev[0])), prev[0])[1] for i in thing]

但它们的可读性远低于for循环。

在Python 3中,有itertools.accumulate,这是您想要的功能mapfilterforif的功能列表理解中的条款。输出的第一项是输入的第一项,之后的项是通过将上一个输出项和下一个输入项传递给您指定的函数而生成的。

import itertools
def do_something_with(prev_output, next_input):
    return prev_output * next_input

input_list = [1, 4, 2, 5, 3]
l = list(itertools.accumulate(input_list, do_something_with))
# l == [1, 4, 8, 40, 120]

答案 1 :(得分:0)

我从你的问题中理解这一点:我不确定

l=[1]
[ l.append(l[-1]*2) for i,x in enumerate(l,start=1) if i<10 ]
[None, None, None, None, None, None, None, None, None]
>>> l
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]

这将更新列表,但它将返回None

不使用l [-1]:

l=[1]
[ l.append(l[i]*2) for i,x in enumerate(l) if i<10 ]
[None, None, None, None, None, None, None, None, None, None]
>>> l
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]