Как работают 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 ...}. Они заменяют циклы с накоплением и делают код короче и нагляднее.

Назад к списку