2013-03-18 65 views
57

我想比较2个迭代列表并打印出现在两个迭代列表中的项目。if语句的列表理解

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

下面所有的答案是正确的,但也'B =(“Q”)'不创建一个元组。带有一个元素的元组需要一个明确的',',也就是'b =('q',)' – dmg 2013-03-18 10:48:58

+0

我已经将元组更改为'iterables'。 – OrangeTux 2013-03-18 11:03:38

回答

105

您的订单有误。该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] 
+0

谢谢。我看到这篇文章http://stackoverflow.com/questions/4406389/if-else-in-a-list-comprehension关于lambda函数中的if else语句。我认为只使用if语句(没有else)会以相同的顺序工作。 – OrangeTux 2013-03-18 10:51:18

4

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

只要改变顺序:

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

当然。笨。 – OrangeTux 2013-03-18 10:54:55

28

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

但列表理解必须至少一个外环开始。

+0

你一直很有帮助。谢谢。 – 2017-08-21 08:18:47

3

列表理解的公式:

[<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不是在b,否则假y的在]

+0

你不能在列表理解中放置一个'else',而不是至少放置一个。不要将列表理解(过滤)与条件表达式(必须具有值,使else表达式为必需)混淆。 – 2017-06-20 06:00:21

+0

同意。尽管如代码所示,'else'可用于列表理解。 – 2017-06-21 11:43:49

+0

这是一个*条件表达式*。它可以用在有效表达式适用的任何地方。它没有具体的列举理解。 – 2017-06-21 11:45:34