Создание
a = {1, 2, 3}b = set([1, 1, 2])c = set("hello")d = set()e = {x % 3 for x in range(10)}Пустые фигурные скобки {} создают словарь. Пустое множество создаётся только через set().
Элементы множества должны быть хешируемыми и уникальными. Порядок элементов не гарантируется.
Базовые операции
s = {1, 2, 3}print(len(s))print(2 in s)print(sorted(s))s.add(4)s.discard(10)s.remove(1)print(s)Проверка принадлежности работает за O(1) в среднем.
Методы set
| Метод | Оператор | Описание |
|---|---|---|
add(x) | Добавляет элемент | |
remove(x) | Удаляет элемент, иначе KeyError | |
discard(x) | Удаляет элемент, если он есть | |
pop() | Удаляет и возвращает произвольный элемент | |
clear() | Удаляет всё | |
copy() | Поверхностная копия | |
union(*others) | `a \ | b` |
intersection(*others) | a & b | Пересечение |
difference(*others) | a - b | Разность |
symmetric_difference(other) | a ^ b | Симметричная разность |
update(*others) | `a \ | = b` |
intersection_update(*others) | a &= b | Пересечение на месте |
difference_update(*others) | a -= b | Разность на месте |
symmetric_difference_update(other) | a ^= b | Симметричная разность на месте |
issubset(other) | a <= b | Подмножество |
issuperset(other) | a >= b | Надмножество |
isdisjoint(other) | Нет общих элементов | |
a < b, a > b | Строгое подмножество и надмножество |
a = {1, 2, 3, 4}b = {3, 4, 5}print(a | b)print(a & b)print(a - b)print(a ^ b)print({3, 4} <= a)print({3, 4} < a)print(a.isdisjoint({10, 11}))print(a.union([7, 8], [9]))Методы принимают любые итерируемые объекты, а операторы — только множества.
Типичные применения
Удаление дубликатов
data = [3, 1, 3, 2, 1]print(list(set(data)))print(list(dict.fromkeys(data)))set не сохраняет порядок, dict.fromkeys сохраняет.
Быстрая проверка вхождения
allowed = {"read", "write", "exec"}print("read" in allowed)Общие элементы и различия
tags_a = {"python", "code", "web"}tags_b = {"python", "design"}print(tags_a & tags_b)print(tags_a - tags_b)print(len(tags_a | tags_b))frozenset
frozenset — неизменяемый вариант множества. Он хешируем, поэтому может быть ключом словаря и элементом другого множества:
fs = frozenset([1, 2, 3])print(fs | {4})print(fs & {2, 3, 10})print(hash(fs) == hash(frozenset([3, 2, 1])))groups = {frozenset({"a", "b"}): "pair"}print(groups[frozenset({"b", "a"})])nested = {frozenset({1}), frozenset({2})}print(len(nested))У frozenset есть все неизменяющие методы set: union, intersection, difference, symmetric_difference, issubset, issuperset, isdisjoint, copy. Методов add, remove, discard, pop, clear и update-семейства нет.
Результат операции между set и frozenset имеет тип левого операнда.
Включения и множества
words = ["apple", "Avocado", "banana", "Blueberry"]letters = {w[0].lower() for w in words}print(sorted(letters))Производительность
add,remove,in— O(1) в среднем- Объединение и пересечение — линейные от размеров множеств
- Множества тратят больше памяти, чем списки
import timeitlst = list(range(100_000))st = set(lst)print(timeit.timeit(lambda: 99_999 in lst, number=1000))print(timeit.timeit(lambda: 99_999 in st, number=1000))Задания
- Найдите слова, встречающиеся в двух текстах одновременно.
- Проверьте, что в списке нет повторяющихся элементов, без сортировки.
- Объясните, почему
{[1, 2]}вызывает ошибку, а{(1, 2)}— нет.
