описаний списки поддержка if
, но не потому, что else
if
раздел фильтров элементов, вы либо включить элемент или не включать его, булев выбор.
Если вы хотите использовать условное выражение, чтобы построить Iterable части 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