List Comprehensions в Python: руководство для начинающих

Изучите list comprehensions в Python — мощный инструмент для элегантного создания списков. Подробное руководство с практическими примерами, от базового синтаксиса до продвинутых техник. Научитесь писать чистый и эффективный Python-код.

РазработкаPython

6 мин

Что такое 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

Несмотря на элегантность, есть ситуации, когда традиционные циклы предпочтительнее:

  1. Сложная логика: если выражение становится слишком длинным и трудночитаемым

  2. Побочные эффекты: list comprehensions предназначены для создания списков, не для выполнения действий

  3. Глубокая вложенность: больше двух вложенных циклов делают код нечитаемым

Плохой пример (слишком сложно):

# Не делайте так!
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-канале, где начинающие и опытные программисты делятся знаниями, помогают друг другу с задачами и обсуждают новые технологии. Учитесь вместе с нами!

Комментарии