← Назад к вопросам
С какими объектами работает List Comprehension
2.0 Middle🔥 161 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
List Comprehension в Python
List Comprehension - это компактный способ создания списков. Работает с любыми итерируемыми объектами.
Основной синтаксис
new_list = [expression for item in iterable if condition]
Пример 1: Простое преобразование
# Получить квадраты чисел
numbers = [1, 2, 3, 4, 5]
squares = [x**2 for x in numbers]
# Результат: [1, 4, 9, 16, 25]
# Преобразование строк в числа
strings = ['1', '2', '3']
ints = [int(s) for s in strings]
# Результат: [1, 2, 3]
Пример 2: С условием (filter)
numbers = [1, 2, 3, 4, 5, 6]
even = [x for x in numbers if x % 2 == 0]
# Результат: [2, 4, 6]
# Только положительные числа
values = [1, -2, 3, -4, 5]
positive = [x for x in values if x > 0]
# Результат: [1, 3, 5]
С какими объектами работает
Списки:
numbers = [1, 2, 3]
doubled = [x * 2 for x in numbers]
# [2, 4, 6]
Кортежи:
coords = [(1, 2), (3, 4), (5, 6)]
x_coords = [x for x, y in coords]
# [1, 3, 5]
Строки:
text = "hello"
upper = [c.upper() for c in text]
# ['H', 'E', 'L', 'L', 'O']
Словари:
user = {"name": "John", "age": 30, "city": "NYC"}
# Ключи
keys = [k for k in user]
# ['name', 'age', 'city']
# Значения
values = [v for v in user.values()]
# ['John', 30, 'NYC']
# Пары (key, value)
items = [(k, v) for k, v in user.items()]
Множества (Sets):
numbers = {1, 2, 3, 4, 5}
squared = [x**2 for x in numbers]
# [1, 4, 9, 16, 25]
Диапазоны (range):
numbers = [x for x in range(10)]
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# Чётные от 0 до 20
evens = [x for x in range(0, 20, 2)]
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Файлы:
with open('data.txt', 'r') as f:
lines = [line.strip() for line in f]
# Список строк без пробелов в конце
Генераторы:
gen = (x for x in range(5))
result = [x * 2 for x in gen]
# [0, 2, 4, 6, 8]
ZIP:
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
result = [(n, a) for n, a in zip(names, ages)]
# [('Alice', 25), ('Bob', 30), ('Charlie', 35)]
Вложенные List Comprehension
# Матрица (список списков)
matrix = [[1, 2], [3, 4], [5, 6]]
# Развернуть матрицу в одномерный список
flat = [x for row in matrix for x in row]
# [1, 2, 3, 4, 5, 6]
# Создать матрицу размером 3x3
matrix = [[x+y for x in range(3)] for y in range(3)]
# [[0, 1, 2], [1, 2, 3], [2, 3, 4]]
Условная логика
numbers = [1, 2, 3, 4, 5]
# IF-ELSE
result = [x if x % 2 == 0 else x*10 for x in numbers]
# [10, 2, 30, 4, 50]
# IF без ELSE (фильтр)
result = [x for x in numbers if x > 2]
# [3, 4, 5]
Сложные преобразования
# Преобразование списка словарей
users = [
{"name": "Alice", "age": 25},
{"name": "Bob", "age": 30},
{"name": "Charlie", "age": 35}
]
names = [u["name"] for u in users]
# ['Alice', 'Bob', 'Charlie']
# Фильтр по условию
adults = [u["name"] for u in users if u["age"] >= 30]
# ['Bob', 'Charlie']
List vs Set vs Dict Comprehension
# List Comprehension
squares_list = [x**2 for x in range(5)]
# [0, 1, 4, 9, 16]
# Set Comprehension
squares_set = {x**2 for x in range(5)}
# {0, 1, 4, 9, 16}
# Dict Comprehension
squares_dict = {x: x**2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# Generator (скобки вместо квадратных)
squares_gen = (x**2 for x in range(5))
# генератор, не список
Практические примеры
# Извлечение данных из JSON
data = [
{"id": 1, "name": "Alice", "email": "alice@example.com"},
{"id": 2, "name": "Bob", "email": "bob@example.com"}
]
emails = [person["email"] for person in data]
# ['alice@example.com', 'bob@example.com']
# Разделение строки на отдельные элементы
csv_line = "name,age,city"
fields = [f.strip() for f in csv_line.split(',')]
# ['name', 'age', 'city']
# Удаление пустых строк
lines = ['hello', '', 'world', ' ', 'python']
non_empty = [l.strip() for l in lines if l.strip()]
# ['hello', 'world', 'python']
# Создание словаря из списка
items = ['apple', 'banana', 'cherry']
counts = {item: len(item) for item in items}
# {'apple': 5, 'banana': 6, 'cherry': 6}
Когда использовать List Comprehension
Используй когда:
- Нужно преобразовать один список в другой
- Нужно отфильтровать элементы
- Нужно получить подсписок из вложенной структуры
Не используй когда:
- Логика слишком сложная (лучше обычный for)
- List Comprehension становится нечитаемой (> 80 символов)
- Нужно обработать побочные эффекты
Производительность
import timeit
# List Comprehension (быстро)
result = timeit.timeit(lambda: [x**2 for x in range(1000)], number=1000)
# map + lambda (медленнее)
result2 = timeit.timeit(lambda: list(map(lambda x: x**2, range(1000))), number=1000)
# for цикл (самый медленный для этого)
result3 = timeit.timeit(lambda: [x**2 for x in range(1000)], number=1000)
# List Comprehension обычно самый быстрый вариант
Выводы
- List Comprehension работает с любыми итерируемыми объектами
- Это компактный и Pythonic способ создания списков
- Может содержать условия и сложную логику
- Часто быстрее чем map и обычные for циклы
- Есть аналоги: Set Comprehension, Dict Comprehension