使用if语句列出理解

时间:2013-03-18 10:46:36

标签: python if-statement list-comprehension

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

5 个答案:

答案 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'}