列表推导式与三元操作符循环?
我觉得我明白了列表推导式和三元运算符的用法,而且我知道可以把它们结合起来,就像这里所示。我想问的是,如何在一个列表推导式中同时使用这两种表达式。
比如说,如果我有下面这个列表:
lst = ['word','word','multiple words','word']
我想在一行代码里修改这个列表,有没有办法做到呢?我试过我认为最简单的写法:
lst[:] = [word for word in word.split() if ' ' in word else word for word in lst]
但是这样会报语法错误。有没有办法在一行内做到这一点呢?
2 个回答
3
首先,你的顺序搞错了。使用三元运算符时,你应该这样写:
[a if c else b for item in list]
不过,实际上你不能在某个条件下再嵌套另一个列表推导式。层级的数量必须是固定的。
既然你只是想根据空格来分割字符串,其实你可以这样做,因为如果字符串中没有空格,分割后仍然会返回一个只有一个元素的列表:
[subword for word in list for subword in word.split()]
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']
条件表达式可以在任何可以用简单表达式的地方使用;这意味着在列表显示语法中,任何地方提到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
表达式,或者任何嵌套的迭代器(在下一个外层for
循环的每次迭代中计算)。
*这叫做条件表达式;它是一种三元运算符,SQL中的BETWEEN
运算符也是。