我有以下列表理解。
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语句,它运行正常。我是否以某种方式写了其他声明?
答案 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]