2013-03-18 81 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