列表推导式与三元操作符循环?

5 投票
2 回答
11968 浏览
提问于 2025-04-18 00:27

我觉得我明白了列表推导式和三元运算符的用法,而且我知道可以把它们结合起来,就像这里所示。我想问的是,如何在一个列表推导式中同时使用这两种表达式。

比如说,如果我有下面这个列表:

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']

条件表达式可以在任何可以用简单表达式的地方使用;这意味着在列表显示语法中,任何地方提到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表达式,或者任何嵌套的迭代器(在下一个外层for循环的每次迭代中计算)。

*这叫做条件表达式;它是一种三元运算符,SQL中的BETWEEN运算符也是。

撰写回答