← Назад к вопросам
Что такое 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-разработчика.