Условия в генераторах списков: if и if-else

Условия в генераторах списков: if и if-else Генераторы списков и словарей

Привет! В прошлых статьях мы научились создавать генераторы списков. Теперь разберёмся, как добавлять в них условия. Это делает генераторы ещё более мощными.

В этой статье мы разберём:

  • if в конце — фильтрация
  • if-else в выражении — преобразование
  • Разницу между этими подходами
  • Когда что использовать

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный Python
  • Базовое понимание генераторов списков (статьи 1–2 в этом подменю)

Совет: Условия в генераторах могут быть двух типов. Важно различать их.

Основная часть

if в конце — фильтрация

[выражение for переменная in итератор if условие]

Пример 1: Только чётные числа

even_numbers = [x for x in range(10) if x % 2 == 0]
print(even_numbers)   # [0, 2, 4, 6, 8]

Пример 2: Только строки длиннее 4 символов

words = ["cat", "python", "dog", "elephant"]
long_words = [word for word in words if len(word) > 4]
print(long_words)   # ['python', 'elephant']

Пример 3: Только положительные числа

numbers = [10, -5, 3, -2, 8, -1]
positive = [x for x in numbers if x > 0]
print(positive)   # [10, 3, 8]

Совет: if в конце просто фильтрует элементы. Если условие истинно — элемент попадает в список, если ложно — пропускается.

if-else в выражении — преобразование

[выражение_если_True if условие else выражение_если_False for переменная in итератор]

Пример 1: Чётные — квадрат, нечётные — 0

result = [x ** 2 if x % 2 == 0 else 0 for x in range(10)]
print(result)   # [0, 0, 4, 0, 16, 0, 36, 0, 64, 0]

Пример 2: Положительные оставляем, отрицательные заменяем на 0

numbers = [10, -5, 3, -2, 8, -1]
result = [x if x > 0 else 0 for x in numbers]
print(result)   # [10, 0, 3, 0, 8, 0]

Пример 3: Длинные слова — uppercase, короткие — lowercase

words = ["cat", "python", "dog", "elephant"]
result = [word.upper() if len(word) > 4 else word.lower() for word in words]
print(result)   # ['cat', 'PYTHON', 'dog', 'ELEPHANT']

Совет: if-else в выражении преобразует каждый элемент. Каждый элемент обрабатывается, но в зависимости от условия результат может быть разным.

Сравнение: if в конце vs if-else в выражении

if в концеif-else в выражении
НазначениеФильтрацияПреобразование
Количество элементовМожет уменьшитьсяОстаётся прежним
Пропускает элементыДаНет
Синтаксис[x for x in data if cond][x if cond else y for x in data]

Пример сравнения:

# if в конце (фильтрация) — только чётные
even = [x for x in range(10) if x % 2 == 0]
print(even)   # [0, 2, 4, 6, 8] (5 элементов)

# if-else в выражении (преобразование) — все элементы
result = [x if x % 2 == 0 else 0 for x in range(10)]
print(result)   # [0, 0, 2, 0, 4, 0, 6, 0, 8, 0] (10 элементов)

Комбинирование условий

Несколько условий:

# Чётные числа больше 5
result = [x for x in range(10) if x % 2 == 0 if x > 5]
print(result)   # [6, 8]

# Эквивалентно
result = [x for x in range(10) if x % 2 == 0 and x > 5]
print(result)   # [6, 8]

Сложное преобразование:

# Если положительное — квадрат, если отрицательное — 0, если ноль — -1
numbers = [5, -3, 0, 8, -2, 0, 4]
result = [x ** 2 if x > 0 else -1 if x == 0 else 0 for x in numbers]
print(result)   # [25, 0, -1, 64, 0, -1, 16]

Примеры из реальной жизни

Пример 1. Обработка данных из файла:

# Список чисел (представлены в виде строк)
data = ["10", "abc", "25", "xyz", "30", "0"]

# Преобразуем в числа только валидные строки
numbers = [int(x) for x in data if x.isdigit()]
print(numbers)   # [10, 25, 30, 0]

Пример 2. Фильтрация списка словарей:

users = [
    {"name": "Анна", "age": 25},
    {"name": "Иван", "age": 17},
    {"name": "Петр", "age": 30},
    {"name": "Мария", "age": 16}
]

adults = [user for user in users if user["age"] >= 18]
print(adults)
# [{"name": "Анна", "age": 25}, {"name": "Петр", "age": 30}]

Пример 3. Маскировка данных:

# Замена отрицательных чисел на 0
sales = [100, -5, 200, -10, 50]
sales_clean = [x if x > 0 else 0 for x in sales]
print(sales_clean)   # [100, 0, 200, 0, 50]

Задачи для закрепления

Задача 1. Напиши генератор, который создаёт список чисел от 0 до 20, которые делятся на 3.

Задача 2. Напиши генератор, который создаёт список чётных чисел от 0 до 10, заменяя нечётные на -1.

Задача 3. Напиши генератор, который создаёт список строк, где слова короче 5 символов приводятся к нижнему регистру, а длиннее — к верхнему.

Задача 4. Напиши генератор, который создаёт список чисел, заменяя отрицательные на 0 и оставляя положительные без изменений.

Задача 5. Напиши генератор, который создаёт список из чисел, которые одновременно делятся на 2 и на 3.

Ответы:

Задача 1.

div_by_3 = [x for x in range(21) if x % 3 == 0]
print(div_by_3)   # [0, 3, 6, 9, 12, 15, 18]

Задача 2.

result = [x if x % 2 == 0 else -1 for x in range(11)]
print(result)   # [0, -1, 2, -1, 4, -1, 6, -1, 8, -1, 10]

Задача 3.

words = ["cat", "python", "dog", "elephant"]
result = [w.upper() if len(w) > 4 else w.lower() for w in words]
print(result)   # ['cat', 'PYTHON', 'dog', 'ELEPHANT']

Задача 4.

numbers = [5, -3, 8, -1, 0, -7, 4]
result = [x if x > 0 else 0 for x in numbers]
print(result)   # [5, 0, 8, 0, 0, 0, 4]

Задача 5.

result = [x for x in range(21) if x % 2 == 0 and x % 3 == 0]
print(result)   # [0, 6, 12, 18]

Нюансы и подводные камни

Путаница между if и if-else

# Неправильно (синтаксическая ошибка)
[x if x % 2 == 0 for x in range(10)]

# Правильно (фильтрация)
[x for x in range(10) if x % 2 == 0]

# Правильно (преобразование)
[x if x % 2 == 0 else -1 for x in range(10)]

Экранирование сложных выражений

# Слишком сложно для одной строки
result = [x ** 2 if x > 0 else -1 if x == 0 else 0 for x in numbers]

# Лучше разбить на функцию
def transform(x):
    if x > 0:
        return x ** 2
    elif x == 0:
        return -1
    else:
        return 0

result = [transform(x) for x in numbers]

Условия с вложенными циклами

# Фильтрация во внутреннем цикле
result = [(i, j) for i in range(3) for j in range(3) if i + j > 3]

Частые ошибки и как их избежать

Ошибка 1: Неправильный синтаксис if-else в выражении

# Неправильно
[x if x % 2 == 0 for x in range(10)]

# Правильно
[x if x % 2 == 0 else -1 for x in range(10)]

Ошибка 2: Путаница между фильтрацией и преобразованием

if в конце — фильтрует
if-else в выражении — преобразует

Ошибка 3: Слишком сложные условия

Выноси сложную логику в функцию или несколько строк.

Шпаргалка

Что нужноКак пишется
Фильтрация[x for x in data if x > 0]
Преобразование[x if x > 0 else 0 for x in data]
Фильтрация с несколькими условиями[x for x in data if cond1 if cond2]
Преобразование с несколькими условиями[a if c1 else b if c2 else c for x in data]

Заключение / Выводы

Сегодня мы:

  • Научились использовать if в конце для фильтрации
  • Научились использовать if-else в выражении для преобразования
  • Разобрали разницу между ними
  • Решали практические задачи

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×