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

5

我想我理解列表推导式和三元操作符,并且我知道我可以将它们结合起来,就像这里看到的那样。我的问题涉及在一个列表推导式中组合这两个表达式。

例如,如果我有以下列表:

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

我想用一行代码修改列表,有没有办法这样做?我尝试了我认为最明显的方法:

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

这将会抛出语法错误。是否有一种方法可以在一行中完成这个操作?


我强烈建议您考虑其他实现方式。在列表推导中嵌套循环相对较难阅读。 - Marcin
2个回答

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 运算符也是。


3

首先,你的顺序是错误的。要使用三元运算符,你必须这样做:

[a if c else b for item in list]

话虽如此,但你不能根据某些条件嵌套另一个列表推导式。层数必须是固定的。

由于您只是想按空格进行拆分,因此无论如何都可以执行此操作,因为在没有空格的情况下拆分字符串仍将返回一个包含单个项目的列表:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接