列表推导式支持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