可以在其方法中使用列表推导衍生物吗?

时间:2015-05-08 14:42:04

标签: python list-comprehension

请考虑以下代码:

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))

可以吗?

2 个答案:

答案 0 :(得分:6)

在进行递归任务时,根据函数的功能,可以将函数与列表推导或生成器表达式混合使用。

例如考虑以下代码:

>>> 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)。

答案 1 :(得分:2)

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

i = (lambda a: a.index(f(a)))([... for i in input])
但是,这仍然有点难看。您使用临时变量a的第一个示例更清晰。将单行编写为练习很有趣,但通常不是编写可维护代码的最佳方法。