List Comprehensions в Python: руководство для начинающих
Изучите list comprehensions в Python — мощный инструмент для элегантного создания списков. Подробное руководство с практическими примерами, от базового синтаксиса до продвинутых техник. Научитесь писать чистый и эффективный Python-код.
Что такое list comprehensions?
List comprehension — это компактный способ создания нового списка на основе существующей последовательности или итерируемого объекта. Вместо того чтобы писать несколько строк с циклами, вы можете выразить ту же логику в одной строке.
Базовый синтаксис
Основная структура list comprehension выглядит так:
новый_список = [выражение for элемент in последовательность]Пример: традиционный подход vs list comprehension
Давайте создадим список квадратов чисел от 0 до 9.
Традиционный подход:
squares = []
for i in range(10):
squares.append(i ** 2)
print(squares)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]С list comprehension:
squares = [i ** 2 for i in range(10)]
print(squares)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]Результат одинаковый, но второй вариант короче и читается почти как обычное предложение: "создай список квадратов i для каждого i в диапазоне от 0 до 9".

Добавляем условия
Вы можете фильтровать элементы, добавляя условие в конце:
новый_список = [выражение for элемент in последовательность if условие]Примеры с условиями
Только чётные числа:
evens = [i for i in range(20) if i % 2 == 0]
print(evens)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]Квадраты только нечётных чисел:
odd_squares = [i ** 2 for i in range(10) if i % 2 != 0]
print(odd_squares)
# [1, 9, 25, 49, 81]Фильтрация строк:
words = ["apple", "banana", "cherry", "date", "elderberry"]
long_words = [word for word in words if len(word) > 5]
print(long_words)
# ['banana', 'cherry', 'elderberry']Работа со строками
List comprehensions отлично подходят для обработки строк.
Преобразование в верхний регистр:
names = ["anna", "bob", "charlie"]
upper_names = [name.upper() for name in names]
print(upper_names)
# ['ANNA', 'BOB', 'CHARLIE']Извлечение первых букв:
words = ["Python", "is", "awesome"]
first_letters = [word[0] for word in words]
print(first_letters)
# ['P', 'i', 'a']Вложенные циклы
List comprehensions поддерживают вложенные циклы для работы с многомерными данными.
Создание пар координат:
coordinates = [(x, y) for x in range(3) for y in range(3)]
print(coordinates)
# [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]Перемножение элементов двух списков:
list1 = [1, 2, 3]
list2 = [10, 20, 30]
products = [x * y for x in list1 for y in list2]
print(products)
# [10, 20, 30, 20, 40, 60, 30, 60, 90]
Условный оператор if-else
Вы можете использовать тернарный оператор для более сложной логики:
новый_список = [выражение_if if условие else выражение_else for элемент in последовательность]Пример: чётные заменяем на "чётное", нечётные оставляем как есть:
numbers = [1, 2, 3, 4, 5, 6]
result = ["чётное" if n % 2 == 0 else n for n in numbers]
print(result)
# [1, 'чётное', 3, 'чётное', 5, 'чётное']Практические примеры
Работа со словарями
Извлечение значений:
prices = {"apple": 50, "banana": 30, "cherry": 80}
expensive = [fruit for fruit, price in prices.items() if price > 40]
print(expensive)
# ['apple', 'cherry']Обработка файлов
Чтение и фильтрация строк:
# Предположим, у нас есть файл с текстом
lines = [" hello ", "world", " Python ", ""]
cleaned = [line.strip() for line in lines if line.strip()]
print(cleaned)
# ['hello', 'world', 'Python']Математические операции
Применение функции ко всем элементам:
import math
numbers = [4, 9, 16, 25]
roots = [math.sqrt(n) for n in numbers]
print(roots)
# [2.0, 3.0, 4.0, 5.0]Когда НЕ стоит использовать list comprehensions
Несмотря на элегантность, есть ситуации, когда традиционные циклы предпочтительнее:
Сложная логика: если выражение становится слишком длинным и трудночитаемым
Побочные эффекты: list comprehensions предназначены для создания списков, не для выполнения действий
Глубокая вложенность: больше двух вложенных циклов делают код нечитаемым
Плохой пример (слишком сложно):
# Не делайте так!
result = [x * y if x % 2 == 0 else x + y for x in range(10) if x > 5 for y in range(10) if y % 3 == 0]Лучше разбить на несколько строк с обычными циклами.
Другие виды comprehensions
Python поддерживает не только list comprehensions:
Dictionary comprehension:
squares_dict = {x: x ** 2 for x in range(5)}
print(squares_dict)
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}Set comprehension:
unique_squares = {x ** 2 for x in [1, 2, 2, 3, 3, 4]}
print(unique_squares)
# {1, 4, 9, 16}Generator expression (для экономии памяти):
squares_gen = (x ** 2 for x in range(1000000))
# Создаёт генератор, а не список, экономя памятьПроизводительность
List comprehensions обычно работают быстрее, чем эквивалентные циклы с append(), потому что они оптимизированы на уровне интерпретатора Python.
Заключение
List comprehensions — это мощный инструмент, который делает ваш Python-код более элегантным и читаемым. Начните с простых примеров, практикуйтесь на реальных задачах, и со временем вы будете использовать их естественно и эффективно.
Ключевые моменты для запоминания:
List comprehensions делают код короче и выразительнее
Можно добавлять условия для фильтрации
Поддерживаются вложенные циклы
Не злоупотребляйте сложностью — читаемость важнее краткости
Существуют также dict, set comprehensions и generator expressions
Практикуйтесь, экспериментируйте, и list comprehensions станут естественной частью вашего стиля программирования на Python!
Присоединяйтесь к Кодик — нашему обучающему приложению для разработчиков! У нас есть дружелюбное комьюнити в Telegram-канале, где начинающие и опытные программисты делятся знаниями, помогают друг другу с задачами и обсуждают новые технологии. Учитесь вместе с нами!