列表理解循环+三元操作循环?

时间:2014-03-29 18:04:15

标签: python list syntax list-comprehension

我认为我理解列表理解和三元操作,我理解我可以将两者结合起来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]

抛出语法错误。有没有办法在一行中做到这一点?

2 个答案:

答案 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中的任何位置expressionold_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()]