与 if 语句的列表内涵

我想比较2个迭代并打印出现在这两个迭代中的项。

>>> a = ('q', 'r')
>>> b = ('q')




# Iterate over a. If y not in b, print y.
# I want to see ['r'] printed.
>>> print([ y if y not in b for y in a])
^

但是它给了我一个无效的语法错误,其中的 ^已被放置。 这个 lamba 函数有什么问题吗?

213327 次浏览

这不是 lambda 函数这是个列表内涵。

只要改变顺序:

[ y for y in a if y not in b]

你把 if放在最后:

[y for y in a if y not in b]

列表理解的书写顺序与嵌套的完全指定的对应部分相同,基本上上述语句翻译为:

outputlist = []
for y in a:
if y not in b:
outputlist.append(y)

你的版本试图这样做:

outputlist = []
if y not in b:
for y in a:
outputlist.append(y)

但是列表内涵的 必须的至少从 外环开始。

你把顺序搞错了。 if应该在 for之后(除非它在 if-else三元操作符中)

[y for y in a if y not in b]

然而,这种做法可能会奏效:

[y if y not in b else other_value for y in a]

列表内涵配方:

[<value_when_condition_true> if <condition> else <value_when_condition_false> for value in list_name]

因此你可以这样做:

[y for y in a if y not in b]

只作示范用途: [ y if y not in b else False for y in a ]

如果使用足够大的列表 not in b子句将对 a中的每个项目进行线性搜索。为什么不用 set?Set 以 iterable 作为参数来创建一个新的 Set 对象。

>>> a = ["a", "b", "c", "d", "e"]
>>> b = ["c", "d", "f", "g"]
>>> set(a).intersection(set(b))
{'c', 'd'}