2010-06-01 41 views
142

這裏是我試圖變成一個列表理解的代碼:是否可以在Python列表理解中使用'else'?

table = '' 
for index in xrange(256): 
    if index in ords_to_keep: 
     table += chr(index) 
    else: 
     table += replace_with 

是有辦法else語句添加到這個理解?

table = ''.join(chr(index) for index in xrange(15) if index in ords_to_keep) 

回答

229

語法a if b else c是Python中三元運算符的計算結果爲a如果條件b是真實的 - 否則,它的計算結果爲c 。它可以理解的語句中使用:

>>> [a if a else 2 for a in [0,1,0,3]] 
[2, 1, 2, 3] 

因此,對於你的榜樣,

table = ''.join(chr(index) if index in ords_to_keep else replace_with 
       for index in xrange(15)) 
+9

注意的是Python 2.5,後來這隻作品。 – 2010-06-01 22:20:45

+3

真棒!非常有用。 – professorDante 2014-05-05 01:07:17

+6

另請注意,'else'是必需的,不能被忽略,因爲總是需要結果值。 – sebix 2014-08-05 08:51:22

14

如果你想要一個else你不想過濾列表理解,你希望它遍歷每個值。您可以使用true-value if cond else false-value作爲語句來代替,並從末端取下過濾器:

table = ''.join(chr(index) if index in ords_to_keep else replace_with for index in xrange(15)) 
1

而且,我會是正確的結論是列表理解是最有效的方式做到這一點?

也許吧。列表理解本質上不具有計算效率。它仍然在線性運行。

從我個人的經驗: 我通過用上面的for-loop/list-appending類型結構替換列表解析(特別是嵌套的)來大量減少計算時間。在這個應用程序中,我懷疑你會注意到一個區別。

+1

woops,我的意思是詢問連接方法與字符串上的+ =。 – Josh 2010-06-01 17:54:24

+0

有趣。這(http://wiki.python.org/moin/PythonSpeed#Takeadvantageofinterpreteroptimizations)另有說法。 – kennytm 2010-06-01 17:58:29

+0

@Josh:在老版本的Python中,join()方法非常優越。較新版本的解釋器試圖優化+ =方法,但我不確定它的工作情況。我幾乎總是隻使用join()方法。 – 2010-06-01 22:27:40

6

要在Python編程的列表解析中使用else,你可以試試下面的代碼片段。這將解決您的問題,該片段在python 2.7和python 3.5上測試。

obj = ["Even" if i%2==0 else "Odd" for i in range(10)] 
0

偉大的答案,但只是想提一個疑難雜症的是「合格」關鍵字將不在列表中,修真者的if/else部分工作(如張貼在上面提到的例子)。

#works 
list1 = [10, 20, 30, 40, 50] 
newlist2 = [x if x > 30 else x**2 for x in list1 ] 
print(newlist2, type(newlist2)) 

#but this WONT work 
list1 = [10, 20, 30, 40, 50] 
newlist2 = [x if x > 30 else pass for x in list1 ] 
print(newlist2, type(newlist2)) 

這是在Python 3.4上進行了嘗試和測試。 錯誤是如下:

newlist2 = [x if x > 30 else pass for x in list1 ]          
SyntaxError: invalid syntax 

因此,儘量避免在列表內涵通-ES

+0

就列表理解而言,if/else構造只是一個表達式。如果你想離開項目,你需要把你的表達式代替'expr2'在這裏'[expr1 for x in list1 if expr2]' – 2017-03-21 00:08:12

+0

Well pass在一個正常if else塊中對我有效,這意味着它也可以在其他地方工作。但在列表解析中並非如此。 – Plankton 2017-03-21 03:04:22

+1

但這不是一個正常的if/else塊。它是[表達式](https://docs.python.org/3/faq/programming.html#is-there-an-equivalent-of-c-s-ternary-operator)。你也不能在那裏使用elif。 – 2017-03-21 20:06:14

相關問題