Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 人们可以在其方法中使用列表理解导数吗?_Python_List Comprehension - Fatal编程技术网

Python 人们可以在其方法中使用列表理解导数吗?

Python 人们可以在其方法中使用列表理解导数吗?,python,list-comprehension,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([...

考虑以下代码:

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([... for i in input]))
i = [ a.index(f(a)) for a in [[... for i in input],] ]
这样做很有技巧,但会让代码变得很奇怪

这使我产生了这样一种想法,可能有可能在它自己的方法调用中以某种方式使用列表理解生成的列表。比如(显然,两者都不起作用):


可以这样做吗?

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

例如考虑下面的代码:

>>> 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
您可以使用
枚举
进行如下混合:

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

因此,它完全基于您的函数,即如何将其结构放入列表理解或生成器表达式中,然后根据您的需要对其应用一些更改并使用python工具(在本例中,我们使用了
枚举
).

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


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

为什么要扼杀可读性?:)f()做什么?您只是想获取某个列表元素的索引吗?您可以创建一个lambda,并根据您的理解立即调用它:
i=(lambda x:x.index(f(x))([…对于输入中的i])
但这是异端邪说。另外,不要说出一个屏蔽内置输入函数的iterable输入。这是这类事情的最佳实践。Python中的规范快速和合并排序都使用重复的列表理解。请记住,常量因子不会显著增加算法复杂性。也就是说,有些编程语言(如Haskell),不必重新计算保证得到相同结果的相同函数。无论哪种方式,都不必跳转以避免第二个循环。据我所知,您的解决方案仅适用于简单的索引任务;但它不适用于一般情况。我能想到的最简单示例是if f=min(mylist),所以我们可以从生成器中检索最小元素的索引。对于我来说,您的解决方案如何用于这种情况似乎并不明显。而且,正如我在更高的注释中提到的,我的兴趣是是否有任何内置变量,如“\u1”,只允许我访问表达式中以前计算项的结果,而不是以前表达式的结果。