Пусть L = [1, 2, 3, 1, 1, 5]. Вы знаете, почему это работает в Python:

for idx in [idx for idx, item in enumerate(L) if item == 1]:
   dosomething(idx)      # idx = 0, 3, 4 

Но это не так:

for idx, item in enumerate(L) if item == 1:
   dosomething(idx)

?

1
Basj 12 Фев 2014 в 02:23
Ну, потому что понимание списков позволяет нам использовать в цикле условия if-else.
 – 
Ashwini Chaudhary
12 Фев 2014 в 02:25
4
Потому что для второго подхода нет синтаксиса.
 – 
Paulo Bu
12 Фев 2014 в 02:25
5
Потому что первый использует необязательную грамматику понимания [, if <filter>], а второй просто недопустим.
 – 
roippi
12 Фев 2014 в 02:26
2
Я почти уверен, что OP спрашивает почему грамматика языка не позволяет этого. Вопросы о мотивации могут быть слишком основаны на мнении, чтобы работать, но иногда люди из OTOH ищут веские причины, исторические ссылки и / или обсуждения разработчиков, чтобы решить эту проблему.
 – 
DSM
12 Фев 2014 в 02:31
В этом ответе со ссылкой на справочник по языку Python и с некоторыми подробностями о фактическом синтаксисе, о котором идет речь, объясняется, почему эта конструкция недействительна: stackoverflow.com/a/4226532/1858225
 – 
Kyle Strand
12 Фев 2014 в 02:50

1 ответ

Лучший ответ

У вас не может быть такого условного оператора в цикле for, это синтаксическая ошибка.

Это должно быть внутри цикла вот так:

for idx, item in enumerate(L):
    if item == 1:
        dosomething(idx)

Ваш первый пример - это понимание списка, и ваше понимание списка синтаксически корректно.

Кстати, вы можете использовать if и else в одном понимании списка, но синтаксис немного изменится, например:

list_comp = [x if *condition* else y for x in z]

Подробнее о составлении списков здесь, здесь и Google;)

РЕДАКТИРОВАТЬ:

Поскольку это было принято в качестве ответа, я также включу сюда для полноты ссылку, которую @Kyle Strand разместил в комментариях, в отношении фактических причин (под капотом) того, что синтаксис for/if в ваш вопрос недействителен.

for-if без понимания списка в одну строку

3
Community 23 Май 2017 в 13:33