Есть список словарей users, где у некоторых пользователей отсутствует email (например, u.get("email") возвращает None). Нужно получить список email в нижнем регистре, пропуская отсутствующие. Какой вариант обычно наиболее читаемый?

Alist(map(lambda u: u["email"].lower(), filter(lambda u: u.get("email"), users)))
B[u["email"].lower() for u in users if u.get("email")]
C[u.get("email", "").lower() for u in users if u.get("email") is not None]
D{u["email"].lower() for u in users if u.get("email")}
Правильный ответ. Списочное включение с фильтром компактнее map()/filter() и читается одной строкой: «возьми email каждого пользователя, у которого он есть».

Разбор

[u["email"].lower() for u in users if u.get("email")] сразу выражает намерение и возвращает список, как требуется. Вариант с map() и filter() делает то же самое, но требует двух lambda и читается тяжелее. Вариант с u.get("email", "") пропускает только None, но если поле есть и равно пустой строке, фильтр is not None оставит её и .lower() от "" даст "" в итоговом списке. Третий вариант с фигурными скобками без двоеточия даёт set, а не список, и порядок теряется.

Проверь себя · 1/3разбор после ответа
Есть список словарей users, где у некоторых пользователей отсутствует email (например, u.get("email") возвращает None). Нужно получить список email в нижнем регистре, пропуская отсутствующие. Какой вариант обычно наиболее читаемый?
Тренировать Python в Telegram

Ещё вопросы по теме «Генераторы списков и встроенные функции»