Короткий ответ
set — это неупорядоченная коллекция уникальных хешируемых элементов, автоматически отбрасывающая дубликаты, в отличие от list, который допускает повторяющиеся элементы и сохраняет порядок их добавления.
Как это работает подробнее
При добавлении элемента в set Python вычисляет его хеш и проверяет, есть ли уже элемент с таким же значением — если да, новый элемент не добавляется. Это делает set удобным для быстрой проверки принадлежности и удаления дублей, но порядок перечисления элементов не гарантирован и не связан с порядком добавления.
Пример кода
example.py
raw_ids = [1, 2, 2, 3, 1, 4]
unique_ids = set(raw_ids)
print(unique_ids) # {1, 2, 3, 4}, порядок не гарантирован
allowed = {"admin", "editor"}
requested = {"editor", "viewer"}
print(allowed & requested) # {'editor'} — пересечение
print(allowed | requested) # {'admin', 'editor', 'viewer'} — объединение
print(allowed - requested) # {'admin'} — разностьЧто использовать на практике
- Практика. set применяют для дедупликации коллекции (
set(lst)), для операций пересечения/объединения/разности множеств (a & b,a | b,a - b), и когда часто нужно проверять "есть ли элемент в коллекции", а порядок не важен. Элементы множества должны быть хешируемыми, поэтому list и dict нельзя положить в set напрямую, а tuple — можно.
Подводные камни
- Риски. Ожидают от set сохранения порядка вставки, как у list, и получают недетерминированный на вид порядок при переборе. Также пытаются положить в set изменяемый объект (например, list) и получают
TypeError: unhashable type.