如何在列表理解中引用自身? [重复]

问题描述 投票:0回答:3
list_a = [2, 4, 3, 6, 3, 8, 5]

列表理解非常有用。

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

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

例如:

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

itself[i-1]
部分怎么写?

python list-comprehension self-reference
3个回答
9
投票

列表理解旨在成为最简单用例的紧凑表达式。您不能在列表理解中引用列表本身,因为只需使用常规的 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])

2
投票

在创建列表之前您无法引用列表。然而,如果你非常想要一句简单的话,你可以使用这种 hacky

reduce
方法:

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

在 Python > 3.2 中,您可以使用

itertools.accumulate
:

from itertools import accumulate
list_c = list(accumulate(a**2 for a in list_a))

1
投票

您可以从您的理解中访问

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)]
© www.soinside.com 2019 - 2024. All rights reserved.