我认为我理解列表理解和三元操作,我理解我可以将两者结合起来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 :(得分: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 grammar中的任何位置expression
或old_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
表达式或任何嵌套迭代器(评估下一个外部{{的每次迭代) 1}}循环)。
* 它被称为条件表达式;它是一个三元运算符,但SQL for
运算符也是如此。
答案 1 :(得分:3)
首先,您的订单有误。要使用三元运算符,您必须这样做:
[a if c else b for item in list]
话虽如此,根据某些条件,您无法真正嵌入其他列表理解级别。必须修复级别数。
由于你只是想分割空格,你可以随意执行此操作,因为拆分没有空格的字符串仍会返回一个包含单个项目的列表:
[subword for word in list for subword in word.split()]