Условия в генераторе списков

введите сюда описание изображения

Почему первый вариант проходит без ошибок, а второй выводит ошибку? Я вчера видел что и такой и такой вариант канает, но не могу найти ту статью. Будьте добры, объясните пожалуйста


Ответы (2 шт):

Автор решения: Namerek
a = [x for x in range(10) if x > 5]

# В этом случае все элементы меньше или равные 5 будут пропущены

# А ошибка у Вас здесь, бы забыли значение подмены поставить
#               VVVVV 
b = [x if x > 5 else None for x in range(10)]
# В этом варианте все элементы меньше или равные 5 будут заменены на None 

По просьбе из коммента, но без лямбды ибо нафиг не нужна

c = [x for x in range(10) if x % 2 == 0]

Lambda с фильтром

# так чтобы понятно
d = list(filter(lambda x: x % 2 == 0, range(10)))
# так, чтобы по "феншую"
d = list(filter(lambda x: not x % 2, range(10)))

На правах изврата

criteria = lambda x: x > 5
c = [x for x in range(10) if criteria(x)]
→ Ссылка
Автор решения: CrazyElf

Во втором случае вы пытаетесь использовать тернарный оператор, но он по определению должен состоять из трёх частей, и конкретно в питоне он выглядит как значение_если_истина if условие else значение_если_ложь.

В первом же случае if относится к конструкции списочное сокращение и там никакого else даже и не предусмотрено, поэтому там всё корректно.

→ Ссылка