2012-04-03 43 views
61

我們可以在列表理解中使用elif嗎?在列表理解條件中的`elif`

例子:

l = [1, 2, 3, 4, 5] 

for values in l: 
    if values==1: 
     print 'yes' 
    elif values==2: 
     print 'no' 
    else: 
     print 'idle' 

我們可以包括在我們的名單理解的elif,以類似的方式,以上面的代碼?

例如,像一個答案:

['yes', 'no', 'idle', 'idle', 'idle'] 

到現在爲止,我只在列表理解使用ifelse

回答

132

Python的conditional expressions都是一模一樣專爲這種用例組成:

>>> l = [1, 2, 3, 4, 5] 
>>> ['yes' if v == 1 else 'no' if v == 2 else 'idle' for v in l] 
['yes', 'no', 'idle', 'idle', 'idle'] 

希望這有助於:-)

+8

我怎麼樣,這些鏈在一起 – jamylak 2013-04-19 14:04:45

+1

有一些interesti語法中的歷史。多年前,他們推出「高等教育表達」是該語言中五個最需要的變化之一。由於Guido van Rossum明確地將其設計爲一種基於聲明的語言,他堅決抵制了很長一段時間(高級表達式,尤其是他們的濫用,是代碼中很多默默無聞的來源)。當他最終屈服時,他宣佈他故意選擇了一種不鼓勵過度使用的語法。像往常一樣,他做了一個優雅的設計工作。 – holdenweb 2018-01-23 09:42:12

+1

Ternary,dammit(他寫道,注意到他的誦讀困難錯誤來不及編輯)。 – holdenweb 2018-01-23 09:48:39

41
>>> d = {1: 'yes', 2: 'no'} 
>>> [d.get(x, 'idle') for x in l] 
['yes', 'no', 'idle', 'idle', 'idle'] 
+4

我認爲這個表單比在列表comp中執行一個非常長和複雜的if/else邏輯更容易消化 – jdi 2012-04-03 05:26:50

+5

@ jdi儘管條件表達式可能不符合你的口味,但它們*是專門設計來處理if-elif-elif-else鏈的,正如OP所要求的那樣。他們不難學習,並且可以優雅地處理不適合於字典查找邏輯的情況:如果等級> = 90,則其爲'A'如果等級> = 80則否則爲'B'如果等級> = 80則否則爲'C' 70其他'F''。 – 2012-04-03 06:27:46

+0

如果在理解之外定義'd'有什麼好處? – 2018-01-23 09:21:51

1

您可以使用列表理解的是你要創建另一個列表從原來的。

>>> l = [1, 2, 3, 4, 5] 
>>> result_map = {1: 'yes', 2: 'no'} 
>>> [result_map[x] if x in result_map else 'idle' for x in l] 
['yes', 'no', 'idle', 'idle', 'idle'] 
13

你可以,有點。

注意,當你使用類似的語法時才:

['yes' if v == 1 else 'no' for v in l] 

您正在使用的if/else操作的三元形式(如果你熟悉語言,如C,這就像?:結構:(v == 1 ? 'yes' : 'no') )。

的三元形式的if/else運營商不具有「elif的」內置的,但你可以模擬它在「其他」條件:

['yes' if v == 1 else 'no' if v == 2 else 'idle' for v in l] 

這就好比說:

for v in l: 
    if v == 1 : 
     print 'yes' 
    else: 
     if v == 2: 
      print 'no' 
     else: 
      print 'idle' 

所以沒有像你問的那樣直接的'elif'構造,但它可以用嵌套的if/else語句來模擬。

1

另一個簡單的方法是使用條件列表理解是這樣的:

l=[1,2,3,4,5] 
print [[["no","yes"][v==1],"idle"][v!=1 and v!=2] for v in l] 

給你正確的前面回答:

[ '是', '不', '空閒', '空閒', 「閒置」]

0

也許你想這樣的:

l = [1, 2, 3, 4, 5] 

print ([['idle','no','yes'][2*(n==1)+(n==2)] for n in l])