Идея comprehension
Comprehension заменяет цикл с ручным append() / добавлением в коллекцию на одно выражение.
Базовые формы:
# list comprehension
[expr for item in iterable if condition]
# set comprehension
{expr for item in iterable if condition}
# dict comprehension
{key_expr: value_expr for item in iterable if condition}
Это делает код короче и явнее показывает, что мы строим новую коллекцию из другой.
List comprehension
Создаёт новый список, проходится по итерируемому объекту и применяет выражение к каждому элементу, опционально фильтруя по условию.
nums = [1, 2, 3, 4, 5, 6]
squares = [x * x for x in nums if x % 2 == 0]
# [4, 16, 36]
Эквивалентно коду с циклом:
squares = []
for x in nums:
if x % 2 == 0:
squares.append(x * x)
Set comprehension
Создаёт множество (уникальные значения) по аналогичному принципу:
words = ["apple", "Apple", "banana", "banana", "pear"]
unique = {w.lower() for w in words}
# {'apple', 'banana', 'pear'}
Удобно, когда нужно убрать дубликаты и параллельно преобразовать значения.
Dict comprehension
Создаёт словарь, формируя пары «ключ–значение» прямо в выражении:
nums = [1, 2, 3, 4]
squares = {n: n * n for n in nums}
# {1: 1, 2: 4, 3: 9, 4: 16}
С фильтрацией:
data = {"a": 1, "b": 0, "c": 3}
non_zero = {k: v for k, v in data.items() if v != 0}
# {'a': 1, 'c': 3}
Фраза для собеседования
Comprehension — это краткий синтаксис создания коллекций. list comprehension строит список [expr for item in iterable if cond], dict comprehension — словарь {k: v for ... if ...}, set comprehension — множество {expr for ... if ...}. Они заменяют циклы с накоплением и делают код короче и читаемее.