2014-03-29 27 views
4

我想我理解列表理解和三元操作,並且我明白我可以結合這兩個,as seen here。我的問題涉及在一個列表理解中結合這兩個表達式。列表理解循環+三元操作循環?

舉例來說,如果我有以下列表:

lst = ['word','word','multiple words','word'] 

,我要修改一個行列表中,有這樣的一種方式?我嘗試了我認爲最明顯的構造:

lst[:] = [word for word in word.split() if ' ' in word else word for word in lst] 

引發語法錯誤。有一種方法可以在一行中完成此操作嗎?

+0

我強烈建議你想到其他方法來實現這一點。理解中的嵌套循環相對難以閱讀。 – Marcin

回答

3

你並不需要任何條件表達式*這裏,作爲str.split()總是返回一個列表,即使只含一個字:

lst[:] = [word for words in lst for word in words.split()] 

演示:

>>> lst = ['word','word','multiple words','word'] 
>>> [word for words in lst for word in words.split()] 
['word', 'word', 'multiple', 'words', 'word'] 

的條件表達式可用於任何可以在語法中使用簡單表達式的地方;這意味着在任何地方它說,在list display grammarexpressionold_expression

list_display  ::= "[" [expression_list | list_comprehension] "]" 
list_comprehension ::= expression list_for 
list_for   ::= "for" target_list "in" old_expression_list [list_iter] 
old_expression_list ::= old_expression [("," old_expression)+ [","]] 
old_expression  ::= or_test | old_lambda_expr 
list_iter   ::= list_for | list_if 
list_if    ::= "if" old_expression [list_iter] 

所以列表理解的第一部分,但也產生了最外面的迭代器(計算一次),在if表達式,或任何部分嵌套迭代器(評估下一個外部for循環的每次迭代)。

* 它被稱爲條件表達式;它是a三元運算符,但運算符也是SQL BETWEEN

+0

我是個白癡。謝謝你,Martijn。 –

3

首先,您的訂單有誤。要使用三元運算符,你必須做這樣的:

[a if c else b for item in list] 

話雖這麼說,你真的不能有依賴於一些條件嵌入另一個列表理解水平。級別的數量必須固定。

正如你只是希望拆分的空白,你可以儘管執行該反正分裂沒有空白的字符串仍然會還給你一個列表與單個項背:

[subword for word in list for subword in word.split()]