我知道如何在单独的行上使用for循环和if语句,例如:

>>> a = [2,3,4,5,6,7,8,9,0]
... xyz = [0,12,4,6,242,7,9]
... for x in xyz:
...     if x in a:
...         print(x)
0,4,6,7,9

我知道我可以使用一个列表理解来组合这些语句时很简单,例如:

print([x for x in xyz if x in a])

但是我在任何地方都找不到一个很好的例子(可以复制和学习)来演示一组复杂的命令(不仅仅是“print x”),这些命令发生在for循环和一些if语句的组合之后。我期待的是这样的:

for x in xyz if x not in a:
    print(x...)

这不是python应该工作的方式吗?


当前回答

如果生成器表达式太复杂,你也可以使用生成器:

def gen():
    for x in xyz:
        if x in a:
            yield x

for x in gen():
    print x

其他回答

我个人认为这是最漂亮的版本:

a = [2,3,4,5,6,7,8,9,0]
xyz = [0,12,4,6,242,7,9]
for x in filter(lambda w: w in a, xyz):
  print x

Edit

如果你非常热衷于避免使用lambda,你可以使用部分函数应用程序和使用operator模块(它提供了大多数操作符的函数)。

https://docs.python.org/2/library/operator.html#module-operator

from operator import contains
from functools import partial
print(list(filter(partial(contains, a), xyz)))

以下是对公认答案的简化/一行:

a = [2,3,4,5,6,7,8,9,0]
xyz = [0,12,4,6,242,7,9]

for x in (x for x in xyz if x not in a):
    print(x)

12
242

注意,生成器是内联的。这是在python2.7和python3.6上测试的(注意print;))

即便如此,它还是很麻烦:x被提到了四次。

如果生成器表达式太复杂,你也可以使用生成器:

def gen():
    for x in xyz:
        if x in a:
            yield x

for x in gen():
    print x
a = [2,3,4,5,6,7,8,9,0]
xyz = [0,12,4,6,242,7,9]  
set(a) & set(xyz)  
set([0, 9, 4, 6, 7])

本文来源:https://towardsdatascience.com/a-comprehensive-hands-on-guide-to-transfer-learning-with-real-world-applications-in-deep-learning-212bf3b2f27a 出于同样的原因,我使用了下面的代码,它工作得很好:

an_array = [x for x in xyz if x not in a]

这一行是节目的一部分!这意味着XYZ是一个之前定义和赋值的数组,也是变量a

使用生成器表达式(在选择的答案中推荐使用)会带来一些困难,因为结果不是一个数组