2014-10-08 57 views
1

我有以下列表理解。为什么这个列表理解给我一个语法错误?

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

但是当我运行它,蟒蛇吐回这个错误:

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

如果我删除else语句,它运行良好。我以某种方式写了其他的陈述错误?

回答

4

列表理解支持if但不else因为if部分过滤器元素,你要么包含一个元素,或者你不包括它,一个布尔值的选择。

如果你想利用条件表达式来构建for循环,使用括号的迭代部分:

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 
2

你把别人的理解的for子句中,但你需要把整个如果目标表达/ else表达式:

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

当您使用for tower in state if <condition>你说你要如果他们不满足条件,甚至不使用state中的项目。在这种情况下,你不能使用else,因为你所能做的只是处理每个项目(包括列表理解结果中的某些项目),或者不是。另一方面,X if Y else Z是可用作列表理解的目标表达式的正规表达式。这意味着源迭代器中的每个元素都将在结果中生成一个元素,但是if/else将决定该结果项的内容。

1

如何:

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

这是因为Python不支持列表理解滤波器if-else,只有if条款。

但是,您可以实现你想要使用的条件表达式

[tower if tower != space else [] for tower in state] 
结果
相关问题