Что такое множество
Множество — изменяемая коллекция уникальных элементов без гарантированного порядка. Его используют, когда важны уникальность и быстрые проверки вхождения.
Фигурные скобки с элементами создают 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))