2016-11-29 104 views
2

几天前我问了一个关于列表理解的问题:Elegant way to delete items in a list which do not has substrings that appear in another list这是一个生成器表达式吗?

无论如何,我对我的问题得到了很好的回答。这是一个列表理解:

[p for p in process_list if all(e not in p for e in exclude_list)]

我的想法,并将其应用到我的工作。但我不确定是否得到了e not in p for e in exclude_list部分。它看起来像一个生成器表达式,但我不确定。我认为最好在另一篇文章中提出这个问题。

那么它是一个生成器表达式还是别的东西?

+4

是它是一个生成器表达式。 –

+1

是的。它是一个生成器表达式:'(这是一个生成器理解)'。 '[这是一个列表理解]' – inspectorG4dget

+1

在'any()'内,如果你直接传递没有'[']'的表达式,它将被视为生成器表达式 –

回答

2

是的,all(e not in p for e in exclude_list)是一个包含生成器表达式的调用。生成器表达式是只有参数传递给一个调用可以省略括号。在这里,这是all() function被调用。

Generator expressions reference documentation

括号可以只用一个参数调用被省略。

all()函数(以及伴随功能any()经常被给生成器表达式,因为这允许一系列测试的惰性评估只有足够e not in p测试被执行,以确定结果;如果有任何e not in p测试那是假的,all()回报早期并没有进一步测试被执行

3

让蟒蛇告诉你它是什么:

>>> p=[] 
>>> exclude_list=[] 
>>> type(e not in p for e in exclude_list) 
<class 'generator'> 
+0

这是一个很好的方法。但是我认为首先让我感到困惑的是将'exclude_list'中的'e'不包含在'all()'中。而这些括号真的让我怀疑它是否仍然是一个生成器表达式。但是现在我明白了,因为Martijn在他的回答中解释了它, – zyc