我想比较2个iterables并打印出两个iterables中的项目。
>>> 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函数有什么问题?
答案 0 :(得分:152)
你的订单错了。 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]
答案 1 :(得分:33)
您将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)
但列表理解必须至少以一个外循环开始。
答案 2 :(得分:5)
这不是lambda函数。这是列表理解。
只需更改顺序:
[ y for y in a if y not in b]
答案 3 :(得分:5)
列表理解公式:
[<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如果y不在其他地方,那么在y中的y为假]
答案 4 :(得分:0)
如果您使用足够大的列表,not in b
子句将对 a
中的每个项目进行线性搜索。为什么不使用集合? Set 以 iterable 作为参数来创建一个新的 set 对象。
>>> a = ["a", "b", "c", "d", "e"]
>>> b = ["c", "d", "f", "g"]
>>> set(a).intersection(set(b))
{'c', 'd'}