2014-10-08 3 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 

Если удалить заявление еще, он работает нормально. Я что-то пишу неправильно?

ответ

4

описаний списки поддержка if, но не потому, что elseif раздел фильтров элементов, вы либо включить элемент или не включать его, булев выбор.

Если вы хотите использовать условное выражение, чтобы построить 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 
2

Вы ставите еще в предложении о понимании for, но вам нужно положить все, если/другое выражение в целевом выражении:

[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

Это потому, что питон не поддерживает в списке понимание фильтров if-else, только if положения ,

Однако вы можете достичь желаемого результата с помощью условного выражения

[tower if tower != space else [] for tower in state] 
Смежные вопросы