📝 Python

List Comprehensions — Элегантные списки

P
Автор
PyLand Team
📅
Опубликовано
03.04.2026
⏱️
Время чтения
4 мин
👁️
Просмотров
392
🌿
Уровень
Средний

List comprehension создаёт новый список из итерируемого объекта с необязательным преобразованием и условием отбора.

Что такое List Comprehension?

List comprehension — способ создать список в одну строку вместо цикла.

# Обычный цикл
squares = []
for x in [1, 2, 3, 4, 5]:
    squares.append(x ** 2)

# List comprehension — то же самое
squares = [x ** 2 for x in [1, 2, 3, 4, 5]]

print(squares)  # [1, 4, 9, 16, 25]

Синтаксис

# Базовый
[выражение for элемент in итерируемое]

# С фильтром
[выражение for элемент in итерируемое if условие]

# С if-else (ternary внутри выражения)
[знач_если_true if условие else знач_если_false for элемент in итерируемое]

Примеры всех трёх форм:

numbers = [1, 2, 3, 4, 5, 6]

# Преобразование
doubled = [x * 2 for x in numbers]
print(doubled)  # [2, 4, 6, 8, 10, 12]

# Фильтрация
even = [x for x in numbers if x % 2 == 0]
print(even)  # [2, 4, 6]

# Фильтрация + преобразование
doubled_even = [x * 2 for x in numbers if x % 2 == 0]
print(doubled_even)  # [4, 8, 12]

# Ternary — пометить чётные/нечётные
labels = ["чет" if x % 2 == 0 else "нечет" for x in numbers]
print(labels)  # ['нечет', 'чет', 'нечет', 'чет', 'нечет', 'чет']

Четыре основных типа comprehension

1. List Comprehension

# Преобразование типов
strings = ["1", "2", "3", "4"]
numbers = [int(s) for s in strings]
print(numbers)  # [1, 2, 3, 4]

# Фильтрация
numbers = [-5, 2, -3, 8, 0, -1, 10]
positive = [x for x in numbers if x > 0]
print(positive)  # [2, 8, 10]

# Работа со строками
words = ["python", "javascript", "go"]
upper = [word.upper() for word in words]
print(upper)  # ['PYTHON', 'JAVASCRIPT', 'GO']

2. Dict Comprehension

numbers = [1, 2, 3, 4, 5]

# Создать словарь {число: квадрат}
squares_dict = {x: x ** 2 for x in numbers}
print(squares_dict)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# Поменять ключи и значения
prices = {"apple": 50, "banana": 30, "orange": 40}
reversed_prices = {v: k for k, v in prices.items()}
print(reversed_prices)  # {50: 'apple', 30: 'banana', 40: 'orange'}

# Фильтрация словаря
expensive = {k: v for k, v in prices.items() if v > 35}
print(expensive)  # {'apple': 50, 'orange': 40}

3. Set Comprehension

# Уникальные квадраты
numbers = [1, 2, 3, 2, 1, 4, 3]
squares_set = {x ** 2 for x in numbers}
print(squares_set)  # {1, 4, 9, 16}  ← дубликаты убраны автоматически

# Уникальные длинные слова
words = ["python", "go", "java", "python", "go"]
long_unique = {w for w in words if len(w) > 3}
print(long_unique)  # {'java', 'python'}

4. Условные comprehension (if-else)

numbers = [-5, 3, -2, 8, -1, 10]

# Заменить отрицательные на 0
non_negative = [x if x >= 0 else 0 for x in numbers]
print(non_negative)  # [0, 3, 0, 8, 0, 10]

# Множественные условия — категории
data = [5, 12, 3, 18, 25, 7, 30]
categories = [
    "малое" if x < 10
    else "среднее" if x < 20
    else "большое"
    for x in data
]
print(categories)
# ['малое', 'среднее', 'малое', 'среднее', 'большое', 'малое', 'большое']

Comprehension vs map/filter

List comprehension — это читаемая альтернатива map() + filter().

numbers = [1, 2, 3, 4, 5, 6]

# map + filter — менее читаемо, нужен lambda
result = list(map(lambda x: x * 2, filter(lambda x: x % 2 == 0, numbers)))

# List comprehension — проще и яснее
result = [x * 2 for x in numbers if x % 2 == 0]

print(result)  # [4, 8, 12]

Когда использовать map/filter: когда уже есть готовая именованная функция или важна композиция в функциональном стиле.

import math

numbers = [1, 4, 9, 16, 25]

# map с готовой функцией — лаконично
roots = list(map(math.sqrt, numbers))
print(roots)  # [1.0, 2.0, 3.0, 4.0, 5.0]

Практический пример: обработка каталога товаров

data = [
    {"name": "Телефон", "price": 500, "in_stock": True},
    {"name": "Ноутбук", "price": 1200, "in_stock": False},
    {"name": "Мышь", "price": 25, "in_stock": True},
    {"name": "Монитор", "price": 300, "in_stock": True},
]

# Только доступные товары дешевле 600
available = [
    p["name"]
    for p in data
    if p["in_stock"] and p["price"] < 600
]
print(available)  # ['Телефон', 'Мышь', 'Монитор']

# Цены с налогом 10%
prices_with_tax = {
    p["name"]: round(p["price"] * 1.1, 2)
    for p in data
    if p["in_stock"]
}
print(prices_with_tax)
# {'Телефон': 550.0, 'Мышь': 27.5, 'Монитор': 330.0}

# Сгладить вложенные списки (flatten)
nested = [[1, 2, 3], [4, 5], [6, 7, 8]]
flat = [item for sublist in nested for item in sublist]
print(flat)  # [1, 2, 3, 4, 5, 6, 7, 8]

# Очистка данных: убрать пустые строки
lines = ["  Python  ", "", "  Go", "   ", "Java  "]
clean = [line.strip() for line in lines if line.strip()]
print(clean)  # ['Python', 'Go', 'Java']

Частая ошибка: неправильное место if-else

# ❌ СИНТАКСИЧЕСКАЯ ОШИБКА: else после for
result = [x * 2 for x in [1, 2, 3, 4] if x % 2 == 0 else x]
# SyntaxError!

# ✅ ПРАВИЛЬНО: if-else ПЕРЕД for (это ternary-выражение)
result = [x * 2 if x % 2 == 0 else x for x in [1, 2, 3, 4]]
print(result)  # [1, 4, 3, 8]

Правило: if без else — фильтр, идёт после for. if ... else ... — ternary, идёт до for.

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

Списки и словари в Python

Проблема: Хочешь хранить 100 студентов → 100 переменных? Решение: коллекции.

📅 30.03.2026 👁️ 386
📝

Словари в Python: хранение данных парами 📖

Представь, что ты создаешь карточку персонажа в игре. У него есть имя, атака, здоровье, класс....

📅 30.03.2026 👁️ 391
📝

if __name__ == "__main__": точка входа Python

Конструкция if name == "main" определяет точку входа Python-программы: она помогает отличить прямой запуск файла...

📅 14.08.2026 👁️ 44
🎓 Продолжить обучение

В каких курсах используется этот материал

Перейдите к курсу, чтобы закрепить материал на практике.

API на практике: взаимодействие с любыми сервисами Открыть программу курса