2014-10-08 56 views
1

我有以下列表理解。爲什麼這個列表理解給我一個語法錯誤?

return [tower for tower in state if tower != space else []] 

但是當我運行它,蟒蛇吐回這個錯誤:

return [tower for tower in state if tower != space else []] 
                ^
    SyntaxError: invalid syntax 

如果我刪除else語句,它運行良好。我以某種方式寫了其他的陳述錯誤?

回答

4

列表理解支持if但不else因爲if部分過濾器元素,你要麼包含一個元素,或者你不包括它,一個布爾值的選擇。

如果你想利用條件表達式來構建for循環,使用括號的迭代部分:

return [tower for tower in (state if tower != space else [])] 

但我懷疑你想改變的表達在價值代替元素表達式;這不是過濾,你只是爲某些項目產生不同的值。使用conditional expression出示你的價值觀:

return [tower if tower != space else [] for tower in state] 

,或者如果你真的想要進行篩選,簡單地忽略else

return [tower for tower in state if tower != space] 

當構建一個列表理解,記住,你需要閱讀表達嵌套從左至右,最後表達產生結果出左側:

[element_producing_expression for name in iterable if filter_expression] 

是道德等價的:

for name in iterable: 
    if filter_expression: 
     element_producing_expression 

在那裏你可以使用盡可能多的嵌套循環和if過濾器爲您的使用案例需要。

我上述三個選項然後像:

# conditional expression producing the iterable 
for tower in (state if tower != space else []): 
    tower 

# conditional expression in the element expression 
for tower in state: 
    tower if tower != space else [] 

# filtering expression with no else 
for tower in state: 
    if tower != space: 
     tower 
2

你把別人的理解的for子句中,但你需要把整個如果目標表達/ else表達式:

[tower if tower != space else [] for tower in state] 

當您使用for tower in state if <condition>你說你要如果他們不滿足條件,甚至不使用state中的項目。在這種情況下,你不能使用else,因爲你所能做的只是處理每個項目(包括列表理解結果中的某些項目),或者不是。另一方面,X if Y else Z是可用作列表理解的目標表達式的正規表達式。這意味着源迭代器中的每個元素都將在結果中生成一個元素,但是if/else將決定該結果項的內容。

1

如何:

[tower if tower != space else [] for tower in state] 
1

這是因爲Python不支持列表理解濾波器if-else,只有if條款。

但是,您可以實現你想要使用的條件表達式

[tower if tower != space else [] for tower in state] 
結果
相關問題