📖 Теория

⚡ Кратко

Множество set хранит только уникальные хешируемые элементы.

{} создаёт пустой словарь, поэтому пустое множество создаётся через set().

Список нельзя положить в set, потому что list изменяемый и нехешируемый.

add() добавляет элемент, remove() удаляет с ошибкой KeyError, discard() удаляет без ошибки.

pop() удаляет произвольный элемент, потому что порядок множества не гарантирован.

Операции |, &, -, ^ дают объединение, пересечение, разность и симметрическую разность.

Методы update(), intersection_update(), difference_update() изменяют исходное множество.

issubset(), issuperset() и isdisjoint() проверяют отношения между множествами.

unique_numbers = {1, 2, 3, 4, 5}
empty_set = set()
empty_dict = {}

print(unique_numbers)
print(type(empty_set))
print(type(empty_dict))

Топ-3 ошибки: путать ссылку и копию; ожидать порядок там, где его нет; усложнять выражение, когда обычный цикл читается лучше.

Что такое множество

Множество — изменяемая коллекция уникальных элементов без гарантированного порядка. Его используют, когда важны уникальность и быстрые проверки вхождения.

Фигурные скобки с элементами создают set, а пустые фигурные скобки создают dict. Поэтому пустой set пишется как set().

unique_numbers = {1, 2, 3, 4, 5}
empty_set = set()
empty_dict = {}

print(unique_numbers)
print(type(empty_set))
print(type(empty_dict))

Хешируемость

Элемент множества должен быть хешируемым: его hash должен оставаться стабильным во время жизни объекта.

Числа, строки и кортежи из хешируемых элементов подходят. Списки не подходят, потому что их можно менять.

print(hash("hello"))
print(hash(42))
print(hash((1, 2, 3)))

my_list = [1, 2, 3]
print("list hashable:", hasattr(my_list, "__hash__") and my_list.__hash__ is not None)

Преобразование в множество

set(iterable) удаляет дубликаты. Порядок результата не является частью контракта.

Если нужен стабильный вывод, после set используйте sorted() или сохраняйте порядок вручную.

numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = set(numbers)
print(unique_numbers)
print(sorted(unique_numbers))

Добавление и удаление

add() не добавляет дубликат второй раз. remove() строгий и падает, если элемента нет. discard() безопасен для отсутствующих элементов.

pop() у множества не означает «последний элемент», потому что у set нет стабильного порядка.

my_set = {1, 2, 3}
my_set.add(3)
my_set.discard(4)
print(my_set)

Операции и отношения

Операторы множеств позволяют выразить задачи анализа данных коротко: общее, только в первом, только в одном из двух, всё уникальное.

Отношения <=, >= и методы issubset(), issuperset(), isdisjoint() отвечают на вопросы о включении и пересечении.

set1 = {1, 2, 3}
set2 = {3, 4, 5}

print(set1 | set2)
print(set1 & set2)
print(set1 - set2)
print(set1 ^ set2)
print({1, 2}.issubset(set1))
Проверить по документации: Современные уточнения в этом разделе сверяйте с актуальной документацией Python 3.x, особенно если используете поведение памяти или производительности как часть архитектурного решения.