Как работают list comprehension, dict comprehension, set comprehension?
Краткий ответ (для собеседования): list / dict / set comprehension — это компактный синтаксис для создания списков, словарей и множеств из других итерируемых объектов по шаблону: «взять элементы, при необходимости отфильтровать, трансформировать и собрать в новую коллекцию».
Развернутое объяснение
Comprehension заменяет цикл с накоплением результата на одно выражение:
list comprehension
[expression for item in iterable if condition]set comprehension:
{expression 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 ...}. Они заменяют циклы с накоплением и делают код короче и нагляднее.