为什么这个列表理解会给我一个语法错误?

时间:2014-10-08 18:55:55

标签: python if-statement list-comprehension

我有以下列表理解。

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

但是当我运行它时,python吐出了这个错误:

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

如果我删除else语句,它运行正常。我是否以某种方式写了其他声明?

4 个答案:

答案 0 :(得分:5)

列表推导支持if但不支持else,因为if部分过滤元素,您要么包含元素,要么不要包含它,一个布尔选择。

如果您想使用条件表达式构建for循环的 iterable 部分,请使用括号:

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

但我怀疑你想改变元素表达式中表达式的值;如果没有过滤,您只是为某些项目生成不同的值。使用conditional expression生成您的值:

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

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

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

构建列表推导时,请记住您需要从左到右读取表达式为嵌套,最后的表达式在左侧生成结果:

[element_producing_expression for name in iterable if filter_expression]

是道德等同于:

for name in iterable:
    if filter_expression:
        element_producing_expression

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

我上面描述的三个选项与:

相同
# 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

答案 1 :(得分:2)

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

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

当您使用for tower in state if <condition>时,如果他们不满足条件,则表示您甚至不想使用state中的项目。在这种情况下,您无法使用else,因为您所能做的就是处理每个项目(包括列表推导结果中的内容),或者不处理。

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

答案 2 :(得分:1)

这个怎么样:

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

答案 3 :(得分:1)

那是因为python在列表推导过滤器中不支持if-else,只支持if子句。

但是,您可以使用条件表达式

来获得所需的结果
 [tower if tower != space else [] for tower in state]