Что такое множество (set) и когда его использовать?
- Чем 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 допускает повторы, если элементы разных типов
Что спросят дальше
Разбор темы
- Типы и коллекции — что изменяемо, что хешируемо и как устроен dict
Изменяемые и неизменяемые типы, список и кортеж, словарь и множество на хеш-таблице, is против ==, модуль collections.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.