128

我想比较 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函数有什么问题?

4

5 回答 5

229

你把顺序弄错了。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]
于 2013-03-18T10:48:08.633 回答
45

你把它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)

但是列表推导必须至少从一个外循环开始。

于 2013-03-18T10:47:26.553 回答
8

列表理解公式:

[<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]

于 2016-09-09T09:49:51.680 回答
5

这不是 lambda 函数。这是一个列表理解。

只需更改顺序:

[ y for y in a if y not in b]
于 2013-03-18T10:47:13.357 回答
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'}
于 2021-01-13T01:10:56.130 回答