可以在其方法中使用列表理解派生吗?

Can one use list comprehension derivatives in its methods?

考虑以下代码:

a = [... for i in input]
i = a.index(f(a))

我想知道我是否可以做单线。明显的尝试是:

i = [... for i in input].index(f([... for i in input]))

但是这个解决方案需要列表生成两次。 不太明显的尝试是:

i = [ a.index(f(a)) for a in [[... for i in input],] ]

这很管用,但代码真的很奇怪。

这让我想到,可能有可能以某种方式在其自己的方法调用中使用由列表推导生成的列表。类似的东西(显然都不起作用):

i = [... for i in input].index(f(_))
# or
i = [... for i in input].index(f(self))

能做到吗?

在执行递归任务时,根据函数的作用,您可以将函数与列表理解或生成器表达式混合使用。

例如考虑以下代码:

>>> f=lambda x:next(i for i in x if i.startswith('a'))
>>> 
>>> a=['df','sr','t','aaf','ar','trf']
>>> a.index(f(a))
3

您可以使用 enumerate 进行如下混合:

>>> next(i for i,j in enumerate(a) if j.startswith('a'))
3

所以这一切都基于你的 函数 你如何将它的结构放在列表理解或生成器表达式中,然后对其应用一些更改并使用 python 工具根据您的需要(在这种情况下我们使用 enumerate)。

避免重复列表理解的一种方法是创建一个匿名函数并直接调用它(未经测试):

i = (lambda a: a.index(f(a)))([... for i in input])

不过,这还是有点难看。您使用临时变量 a 的第一个示例更加清晰。将单行代码作为一种练习很有趣,但它通常不是编写可维护代码的最佳方式。