我想比较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 函数有什么问题吗?
^
这不是 lambda 函数这是个列表内涵。
只要改变顺序:
[ y for y in a if y not in b]
你把 if放在最后:
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三元操作符中)
for
if-else
然而,这种做法可能会奏效:
[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 if y not in b else False for y in a ]
如果使用足够大的列表 not in b子句将对 a中的每个项目进行线性搜索。为什么不用 set?Set 以 iterable 作为参数来创建一个新的 Set 对象。
not in b
a
>>> a = ["a", "b", "c", "d", "e"] >>> b = ["c", "d", "f", "g"] >>> set(a).intersection(set(b)) {'c', 'd'}