← Назад к вопросам

Что такое list comprehension и когда его использовать?

1.0 Junior🔥 161 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое list comprehension и когда его использовать?

List comprehension (списковое выражение) — это компактный и элегантный способ создания нового списка путём трансформации или фильтрации существующей итерируемой последовательности. Это одна из самых "питонических" особенностей языка.

Основной синтаксис

# Базовая форма
new_list = [expression for item in iterable]

# С условием (фильтр)
new_list = [expression for item in iterable if condition]

# Вложенные циклы
new_list = [expression for item1 in iterable1 for item2 in iterable2]

# Вложенный условие
new_list = [expression for item in iterable if condition1 if condition2]

1. Простой пример: трансформация

# Без list comprehension
original = [1, 2, 3, 4, 5]
squares = []
for num in original:
    squares.append(num ** 2)
print(squares)  # [1, 4, 9, 16, 25]

# С list comprehension — компактнее
squares = [num ** 2 for num in original]
print(squares)  # [1, 4, 9, 16, 25]

2. Фильтрация данных

# Получить только чётные числа
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Обычный способ
evens = []
for num in numbers:
    if num % 2 == 0:
        evens.append(num)

# List comprehension — один строку
evens = [num for num in numbers if num % 2 == 0]
print(evens)  # [2, 4, 6, 8, 10]

# Несколько условий
filtered = [num for num in numbers if num % 2 == 0 if num > 4]
print(filtered)  # [6, 8, 10]

3. Трансформация со строками

# Преобразовать в верхний регистр
words = ['hello', 'world', 'python']
upper_words = [word.upper() for word in words]
print(upper_words)  # ['HELLO', 'WORLD', 'PYTHON']

# Получить длины слов
lengths = [len(word) for word in words]
print(lengths)  # [5, 5, 6]

# Получить первую букву каждого слова
first_letters = [word[0] for word in words]
print(first_letters)  # ['h', 'w', 'p']

4. Работа со словарями

# Получить только значения
user = {'name': 'Alice', 'age': 30, 'city': 'NYC'}
values = [value for value in user.values()]
print(values)  # ['Alice', 30, 'NYC']

# Получить пары (key, value)
pairs = [(key, value) for key, value in user.items()]
print(pairs)  # [('name', 'Alice'), ('age', 30), ('city', 'NYC')]

# Трансформировать словарь (ключи в верхний регистр)
transformed = [key.upper() for key in user.keys()]
print(transformed)  # ['NAME', 'AGE', 'CITY']

5. Вложенные циклы

# Создать таблицу умножения
table = [[i*j for j in range(1, 4)] for i in range(1, 4)]
print(table)
# [[1, 2, 3], [2, 4, 6], [3, 6, 9]]

# Распределение пар от нескольких списков
colors = ['red', 'blue']
sizes = ['S', 'M', 'L']
pairs = [f"{color}-{size}" for color in colors for size in sizes]
print(pairs)
# ['red-S', 'red-M', 'red-L', 'blue-S', 'blue-M', 'blue-L']

# Flatten вложенного списка
nested = [[1, 2, 3], [4, 5], [6, 7, 8]]
flat = [num for sublist in nested for num in sublist]
print(flat)  # [1, 2, 3, 4, 5, 6, 7, 8]

6. Практические примеры из реальной жизни

Парсинг CSV:

csv_data = """name,age,city
Alice,30,NYC
Bob,25,LA
Charlie,35,Chicago"""

lines = csv_data.strip().split('\n')
header = lines[0].split(',')
rows = [dict(zip(header, line.split(','))) for line in lines[1:]]
print(rows)
# [{'name': 'Alice', 'age': '30', 'city': 'NYC'}, ...]

Извлечение данных из JSON:

import json

json_data = '''[
    {"name": "Alice", "age": 30},
    {"name": "Bob", "age": 25},
    {"name": "Charlie", "age": 35}
]'''

data = json.loads(json_data)
names = [person['name'] for person in data]
ages = [person['age'] for person in data]
print(names)  # ['Alice', 'Bob', 'Charlie']
print(ages)   # [30, 25, 35]

Трансформация URL параметров:

# Создать query string
params = {'name': 'Alice', 'age': 30, 'city': 'NYC'}
query_string = '&'.join([f"{key}={value}" for key, value in params.items()])
print(query_string)  # name=Alice&age=30&city=NYC

Валидация данных:

users = [
    {'name': 'Alice', 'age': 30},
    {'name': 'Bob', 'age': 15},
    {'name': 'Charlie', 'age': 25},
]

# Получить только взрослых
adults = [user for user in users if user['age'] >= 18]
print(adults)
# [{'name': 'Alice', 'age': 30}, {'name': 'Charlie', 'age': 25}]

7. Generator Expression — экономия памяти

Генератор выражение похоже на list comprehension, но не создаёт список целиком:

# List comprehension — создаёт весь список в памяти
squares_list = [x**2 for x in range(1000000)]

# Generator expression — создаёт по одному значению
squares_gen = (x**2 for x in range(1000000))

# Использование (ленивые вычисления)
for square in squares_gen:
    print(square)
    # Каждый раз вычисляется одно значение

# Функции, которые ожидают итератор
sum(x**2 for x in range(100))  # generator нужен скобкам
any(x > 50 for x in range(100))
all(x < 100 for x in range(100))

8. Сравнение производительности

import timeit

# Вариант 1: обычный цикл
def loop_version():
    result = []
    for i in range(1000):
        result.append(i ** 2)
    return result

# Вариант 2: list comprehension
def comprehension_version():
    return [i ** 2 for i in range(1000)]

print(timeit.timeit(loop_version, number=10000))  # ~0.8 сек
print(timeit.timeit(comprehension_version, number=10000))  # ~0.5 сек

# List comprehension быстрее примерно на 40%!

9. Когда использовать list comprehension

Используйте, когда:

  • Создаёте новый список на основе существующего
  • Логика простая (одна-две строки)
  • Нужно отфильтровать или трансформировать данные
  • Хотите более читаемый и питонический код
  • Важна производительность

НЕ используйте, когда:

  • Логика сложная (больше 3 условий)
  • Нужны побочные эффекты (вывод, запись в файл)
  • Производится более одной операции на элемент
  • Результат нужно использовать много раз (лучше generator)

10. Примеры сложных list comprehension

# Трансформировать и фильтровать одновременно
data = [
    {'name': 'Alice', 'score': 85},
    {'name': 'Bob', 'score': 92},
    {'name': 'Charlie', 'score': 78},
]

# Получить имена студентов с оценкой >= 80
top_students = [d['name'] for d in data if d['score'] >= 80]
print(top_students)  # ['Alice', 'Bob']

# Создать кортежи (имя, оценка с бонусом)
bonused = [(d['name'], d['score'] + 5) for d in data if d['score'] < 90]
print(bonused)  # [('Alice', 90), ('Charlie', 83)]

# Условное выражение в comprehension
grades = ['Pass' if d['score'] >= 80 else 'Fail' for d in data]
print(grades)  # ['Pass', 'Pass', 'Fail']

# С условной трансформацией
# (используйте ternary operator)
results = [
    d['name'] + ' (A)' if d['score'] >= 90
    else d['name'] + ' (B)' if d['score'] >= 80
    else d['name'] + ' (C)'
    for d in data
]
print(results)  # ['Alice (B)', 'Bob (A)', 'Charlie (C)']

11. Dict и Set comprehension

# Dict comprehension
squares_dict = {x: x**2 for x in range(5)}
print(squares_dict)  # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# С условием
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares)  # {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}

# Set comprehension
unique_lengths = {len(word) for word in ['apple', 'app', 'application', 'apply']}
print(unique_lengths)  # {3, 4, 11}

# Инвертирование словаря
original = {'a': 1, 'b': 2, 'c': 3}
inverted = {v: k for k, v in original.items()}
print(inverted)  # {1: 'a', 2: 'b', 3: 'c'}

Вывод

List comprehension — это не просто синтаксический сахар, а ключевая идиома Python. Он делает код:

  • Более читаемым — вся логика видна в одной строке
  • Более быстрым — оптимизирован на уровне CPython
  • Более питоническим — это "Python way" делать вещи

Овладение list comprehension (и его вариантами: dict, set, generator) — это маркер опытного Python-разработчика.