关于python:为什么这个列表理解给我一个语法错误?

Why is this list comprehension giving me a syntax error?

本问题已经有最佳答案,请猛点这里访问。

我有以下清单的理解。

1
return [tower for tower in state if tower != space else []]

但是当我运行它时,python会返回这个错误:

1
2
3
return [tower for tower in state if tower != space else []]  
                                                      ^
    SyntaxError: invalid syntax

如果我删除else语句,它将正常运行。我是不是写错了其他的陈述?


列表理解支持if,但不支持else,因为if节过滤元素,您要么包含元素,要么不包含元素,这是布尔选择。

如果要使用条件表达式构建for循环的可Iterable部分,请使用括号:

1
return [tower for tower in (state if tower != space else [])]

但我怀疑您希望改为更改元素表达式中表达式的值;这不是过滤,而是为某些项生成不同的值。使用条件表达式生成值:

1
return [tower if tower != space else [] for tower in state]

或者,如果您真的想过滤,只需省略else

1
return [tower for tower in state if tower != space]

在构造列表理解时,请记住,需要从左到右嵌套读取表达式,最后一个表达式在左侧生成结果:

1
[element_producing_expression for name in iterable if filter_expression]

道德等同于:

1
2
3
for name in iterable:
    if filter_expression:
        element_producing_expression

在这里,您可以根据您的用例的需要使用尽可能多的嵌套循环和if过滤器。

我上面描述的三个选项如下:

1
2
3
4
5
6
7
8
9
10
11
12
# conditional expression producing the iterable
for tower in (state if tower != space else []):
    tower

# conditional expression in the element expression
for tower in state:
    tower if tower != space else []

# filtering expression with no else
for tower in state:
    if tower != space:
        tower


你在理解的for子句中放了else,但你需要把整个if/else表达式放在目标表达式中:

1
[tower if tower != space else [] for tower in state]

当你使用for tower in state if 时,你是说如果不满足条件,你甚至不想使用state中的物品。在这种情况下,您不能使用else,因为您所能做的只是处理每个项目(包括列表理解结果中的内容),或者不处理。

另一方面,X if Y else Z是一个正常的表达式,可以作为列表理解的目标表达式。这意味着源ITerable中的每个元素都将在结果中生成一个元素,但if/else决定结果项是什么。


这是因为python不支持清单中的if-else理解过滤器,只支持if子句。

但是,可以通过使用条件表达式来获得所需的结果。

1
 [tower if tower != space else [] for tower in state]


这个怎么样:

1
[tower if tower != space else [] for tower in state]