← Назад к вопросам
Только ли список можно сделать через List Comprehension
2.0 Middle🔥 161 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Comprehensions в Python: не только списки
Нет, list comprehension — это только одна из разновидностей comprehensions в Python. На самом деле Python поддерживает четыре типа comprehensions: для списков, словарей, множеств и генераторов.
Типы comprehensions
1. List Comprehension (для списков)
Это самый распространённый и известный вид:
# Создание списка чисел от 0 до 9
squares = [x**2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# С условием
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # [0, 4, 16, 36, 64]
2. Set Comprehension (для множеств)
Аналогично list comprehension, но с фигурными скобками и возвращает set вместо списка:
# Уникальные квадраты
uniqueSquares = {x**2 for x in range(10)}
print(uniqueSquares) # {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}
# Пример: удаление дубликатов
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique = {x for x in numbers}
print(unique) # {1, 2, 3, 4}
3. Dictionary Comprehension (для словарей)
Создаёт словарь через comprehension синтаксис:
# Создание словаря с ключами и значениями
squares_dict = {x: x**2 for x in range(5)}
print(squares_dict) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# Трансформация существующего словаря
old_dict = {a: 1, b: 2, c: 3}
new_dict = {key: value*2 for key, value in old_dict.items()}
print(new_dict) # {a: 2, b: 4, c: 6}
# С условием
filtered = {k: v for k, v in old_dict.items() if v > 1}
print(filtered) # {b: 2, c: 3}
4. Generator Expression (для генераторов)
Это как list comprehension, но возвращает generator object вместо списка (экономит память):
# Generator expression использует круглые скобки
squares_gen = (x**2 for x in range(1000000))
print(type(squares_gen)) # <class generator>
# Генератор не вычисляет все значения сразу
first = next(squares_gen) # Только вычисляет первый элемент
print(first) # 0
# Полезно для больших данных
total = sum(x**2 for x in range(1000000)) # Память не переполнится
print(total)
Сравнение производительности
import sys
# List comprehension
list_comp = [x**2 for x in range(10000)]
print(f"List size: {sys.getsizeof(list_comp)} bytes")
# Generator expression
gen_expr = (x**2 for x in range(10000))
print(f"Generator size: {sys.getsizeof(gen_expr)} bytes")
Генератор занимает значительно меньше памяти!
Практические примеры
# Извлечение имён всех пользователей из списка словарей
users = [
{name: Alice, age: 25},
{name: Bob, age: 30},
{name: Charlie, age: 35}
]
names = [user[name] for user in users]
print(names) # [Alice, Bob, Charlie]
# Создание словаря из списка
names_ages = {user[name]: user[age] for user in users}
print(names_ages) # {Alice: 25, Bob: 30, Charlie: 35}
# Уникальные домены из списка email
emails = [user@example.com, admin@example.com, user@other.com]
domains = {email.split(@)[1] for email in emails}
print(domains) # {example.com, other.com}
Когда использовать каждый тип
- List comprehension — когда нужен обычный список с трансформацией
- Set comprehension — для уникальных элементов и быстрого поиска
- Dict comprehension — для создания или трансформации словарей
- Generator expression — для больших данных, когда нужна экономия памяти
Все эти инструменты делают код более читаемым, компактным и pythonic.