Python : 如何在列表理解中引用自己?
Python : How to refer itself in the list comprehension?
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]
的部分怎么写?
添加
对不起,我的解释不好...
我想通过高速方式获取列表
输入列表
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]
就像一个锯齿列表。
列表理解旨在成为最直接用例的紧凑表达式。您不能在列表理解中引用列表本身,因为只需使用常规的 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])
您不能在创建列表之前引用它。然而,如果你非常想要一个单行代码,你可以使用这种 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))
您可以通过理解访问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)]
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]
的部分怎么写?
添加
对不起,我的解释不好...
我想通过高速方式获取列表
输入列表
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]
就像一个锯齿列表。
列表理解旨在成为最直接用例的紧凑表达式。您不能在列表理解中引用列表本身,因为只需使用常规的 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])
您不能在创建列表之前引用它。然而,如果你非常想要一个单行代码,你可以使用这种 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))
您可以通过理解访问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)]