2010-12-10 96 views
253

我有一個列表l如果別人在列表理解

l = [22, 13, 45, 50, 98, 69, 43, 44, 1] 

對於上面的數字45包容性,我想加1;和數字低於它,5

我試圖

[x+1 for x in l if x >= 45 else x+5] 

但它給了我一個語法錯誤。如何在列表理解中實現這樣的ifelse

回答

309
>>> l = [22, 13, 45, 50, 98, 69, 43, 44, 1] 
>>> [x+1 if x >= 45 else x+5 for x in l] 
[27, 18, 46, 51, 99, 70, 48, 49, 6] 

執行 - 的東西,如果<condition>,否則做,別的東西。

+2

可能應該在底部的解釋中使用與`x`不同的變量作爲條件,因爲在本例中不使用`x`作爲條件。 – tscizzle 2015-04-17 20:03:37

+0

如果條件滿足,那麼只有在列表中包含變量纔可以呢?其他的只是通過? – 2016-07-25 16:38:57

78

您必須將表達式放在列表理解的開始處,結尾處的if語句過濾元素!

[x+1 if x >= 45 else x+5 for x in l] 
+17

+1,用於在理解開始時和結束時明確區分條件的作用。你也可以同時做兩件事;例如''上'如果item.isupper()否則'下'的項目'Omg!薄煎餅!!!'如果item.isalpha()]` – Air 2013-10-14 21:55:31

+0

現在我明白了排序邏輯。謝謝你們倆。 – otocan 2017-07-07 11:41:39

104
[x+1 if x >= 45 else x+5 for x in l] 

而獲得獎勵,這裏是評論,我寫了要記住這個我第一次做這樣的錯誤:

Python's conditional expression is a if C else b and can't be used as:

[a for i in items if C else b] 

The right form is:

[a if C else b for i in items] 

Even though there is a valid form:

[a for i in items if C] 

But that isn't the same as that is how you filter by C , but they can be combined:

[a if tC else b for i in items if fC] 
6

你可以移動有條件的:

v = [22, 13, 45, 50, 98, 69, 43, 44, 1] 
[ (x+1 if x >=45 else x+5) for x in v ] 

但它開始顯得有點醜陋,所以你最好使用正常循環。請注意,我使用v而不是l作爲列表變量,以減少與數字1的混淆(我認爲lO在任何情況下都應該作爲變量名避免,即使在快速骯髒的示例代碼中也是如此)。

173

你得到這個錯誤的原因與列表理解的執行方式有關。

請記住以下幾點:

[ expression for item in list if conditional ] 

等同於:

for item in list: 
    if conditional: 
     expression 

expression是在一個稍微不同的格式(覺得切換一個句子的主語和動詞順序)。

因此,您的代碼[x+1 for x in l if x >= 45]做到這一點:

for x in l: 
    if x >= 45: 
     x+1 

但是,此代碼[x+1 if x >= 45 else x+5 for x in l]做到這一點(重排expression後):

for x in l: 
    if x>=45: x+1 
    else: x+5 
12

你也可以把條件表達式中括號內列表理解:

l = [22, 13, 45, 50, 98, 69, 43, 44, 1] 
    print [[x+5,x+1][x >= 45] for x in l] 

[false,true] [condition]是語法

6

我剛剛有一個類似的問題,發現這個問題和答案真的很有用。這是我感到困惑的部分。我明確地寫了它,因爲沒有人真正用英文表示它:

迭代結束。

通常情況下,一個循環將

for this many times: 
    if conditional: 
     do this thing 
    else: 
     do something else 

大家指出列表理解部分簡單地作爲第一個答案一樣,

[ expression for item in list if conditional ] 

但實際上不是你在這種情況下做什麼。 (我試圖這樣做的)

在這種情況下,它更像是這樣的:

[ expression if conditional else other thing for this many times ] 
5

[a if condition1 else b for i in list1 if condition2],兩個if s的condition1condition2做兩件不同的事情。部分(a if condition1 else b)是從一個lambda表達式:

lambda x: a if condition1 else b 

而另一condition2是另一個lambda:

lambda x: condition2 

所有列表解析可以看作的mapfilter組合:

map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1))