Python:如何在列表推导中引用自己?

时间:2018-01-11 10:18:46

标签: python list-comprehension self-reference

lsit_a = [2, 4, 3, 6, 3, 8, 5]

列表理解非常有用。

list_b = [a**2 for a in list_a]

我想知道如何在python列表理解中编写自引用。

例如 -

list_c = [a**2 if i == 0 else a*2 + (itself[i-1]) for i, a in enumurate(list_a)]

如何编写itself[i-1]的部分?

ADD

对不起,我的解释很糟糕......

我希望以高速方式获取列表。

输入列表

list_a = [0,0,1,0,0,0,1,0,0,1,0]

输出列表

list_c = [0,0,1,0.9,0.8,0.7,1,0.9,0.8,1,0.9]

像一个锯齿列表一样。

3 个答案:

答案 0 :(得分:4)

列表理解是针对最简单的用例的紧凑表达式。您无法在列表推导中引用列表本身,因为这只是使用常规for循环:

list_c = []
for i, a in enumerate(list_a):
    if i == 0:
        list_c.append(a ** 2)
    else:
        list_c.append(a * 2 + list_c[i-1])

您还可以以更有效的方式重写该循环:

list_a_iterator = iter(list_a)
list_c = [next(list_a_iterator) ** 2]  # May raise StopIteration if list_a is empty
for item in list_a_iterator:
    list_c.append(item * 2 + list_c[-1])

答案 1 :(得分:2)

您无法在创建列表之前引用该列表。但是,如果你非常想要一个单行,你可以使用这种hacky var container = { first: { a: 1, b: 'someString' } }; container.second = Object.assign({ c: 34, d: 'something else' }, container.first ); console.log(container)方法:

reduce

在Python中> 3.2,您可以使用itertools.accumulate

list_c = reduce(lambda lst, a: lst + [lst[-1] + a**2], list_a, [0])[1:]

答案 2 :(得分:0)

您可以从理解中访问list_a

[a**2 if i == 0 else a*2 + list_a[i-1]**2 if i == 1 else a*2 + list_a[i-1]*2 for i, a in enumerate(list_a)]