Вопрос с собеседования · Python

Что такое множество (set) и когда его использовать?

JuniorКоллекции
Ещё спрашивают так:
  • Чем set отличается от списка?
  • Как быстро убрать дубликаты из списка?
  • Что такое frozenset?
Коротко

set — неупорядоченный набор уникальных хешируемых элементов на хеш-таблице.

  • Проверка x in s в среднем O(1), у списка — O(n)
  • Операции множеств: | объединение, & пересечение, - разность, ^ симметрическая разность

А ещё frozenset — неизменяемая версия, его можно класть в set и делать ключом dict

Подробно

Множество устроено как словарь без значений: элементы хранятся в хеш-таблице. Отсюда свойства:

  • элементы уникальны — повторное добавление ничего не меняет;
  • элементы должны быть хешируемыми (список в множество положить нельзя);
  • порядок не гарантирован — в отличие от dict, множество порядок вставки не сохраняет;
  • проверка принадлежности, добавление и удаление — в среднем O(1).

Когда использовать:

  • частые проверки «есть ли элемент» — например, отфильтровать миллион записей по списку запрещённых id: с set это O(1) на проверку, со списком — O(n);
  • убрать дубликаты: set(items). Если нужен исходный порядок — list(dict.fromkeys(items));
  • сравнение наборов: что есть в обоих списках, чего не хватает.

frozenset — неизменяемое множество: хешируется, может быть элементом другого множества или ключом словаря.

Пустое множество создаётся только как set(): запись {} — пустой словарь.

Пример

banned = {3, 7, 42}
users = [1, 3, 5, 42]
allowed = [u for u in users if u not in banned]   # O(1) на проверку

a, b = {1, 2, 3}, {2, 3, 4}
a | b   # {1, 2, 3, 4}
a & b   # {2, 3}
a - b   # {1}

items = ["b", "a", "b"]
list(dict.fromkeys(items))   # ['b', 'a'] — без дубликатов, порядок сохранён

Что хотят услышать

  • Уникальность и хеш-таблица под капотом.
  • Сложность проверки in по сравнению со списком.
  • Практический случай: фильтрация, удаление дубликатов.
  • frozenset и запись пустого множества set().

Частые ошибки

  • {} вместо set() для пустого множества.
  • Рассчитывать на порядок элементов во множестве.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Уникальные хешируемые элементы в хеш-таблице: in в среднем O(1), есть объединение и пересечение
  • ✗Хранит элементы в порядке добавления, а проверка x in s идёт перебором за O(n)
  • ✗В set можно положить список
  • ✗set допускает повторы, если элементы разных типов

Что спросят дальше

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования