Получить доступ

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

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

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

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

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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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

  • элементы уникальны — повторное добавление ничего не меняет;
  • элементы должны быть хешируемыми (список в множество положить нельзя);
  • порядок не гарантирован — в отличие от 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() для пустого множества.
  • Рассчитывать на порядок элементов во множестве.

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

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем