Глава 11 · Очень много информации!

Операции множеств и хешируемость

Четыре операции алгебры множеств на Венн-диаграммах — и почему список нельзя положить внутрь множества.

Множества как круги на диаграмме Венна

Две группы участников курсов — удобный пример, на котором видно все четыре операции сразу:

dve_gruppy.py
python_users = ['Anna', 'Bob', 'Maria']
data_users = ['Bob', 'Li']

Объединение — union, |

python_users data_users
Anna
Maria
Bob
Li
{'Anna', 'Bob', 'Maria', 'Li'}
python_users | data_users — все, кто есть хоть в одной группе
union.py
print(set(python_users) | set(data_users))

Пересечение — intersection, &

python_users data_users
Anna
Maria
Bob
Li
{'Bob'}
python_users & data_users — кто есть в ОБЕИХ группах
intersection.py
print(set(python_users) & set(data_users))

Разность — difference, -

python_users data_users
Anna
Maria
Bob
Li
{'Anna', 'Maria'}
python_users - data_users — только в первой группе
difference.py
print(set(python_users) - set(data_users))

Симметричная разность — symmetric_difference, ^

python_users data_users
Anna
Maria
Bob
Li
{'Anna', 'Maria', 'Li'}
python_users ^ data_users — в одной группе, но не в обеих сразу
symmetric_difference.py
print(set(python_users) ^ set(data_users))
ОперацияОператорМетод
объединениеa | ba.union(b)
пересечениеa & ba.intersection(b)
разностьa - ba.difference(b)
симметричная разностьa ^ ba.symmetric_difference(b)

Подмножество и надмножество

podmnozhestvo.py
required = {"python", "git"}
available = {"python", "git", "docker", "linux"}

print(required <= available)     # True — required ЦЕЛИКОМ входит в available
print(required.issubset(available))   # то же самое
available required
python
git
docker
linux
required <= available — required (внутренний круг) целиком лежит внутри available (внешний круг)
Оператор / методЗначение
a <= b / a.issubset(b)все элементы a есть и в b
a >= b / a.issuperset(b)все элементы b есть и в a
a.isdisjoint(b)у a и b нет общих элементов вообще

Хешируемость: почему в множестве нельзя хранить список

hashability_error.py
bad = {[1, 2], [3, 4]}
# TypeError: cannot use 'list' as a set element (unhashable type: 'list')
Элементы множества и ключи словаря должны быть достаточно «стабильными»
Python должен быть уверен, что значение внутри множества (или ключ словаря) не изменится незаметно, пока лежит там. Формальный термин для такой стабильности — хешируемость (hashable). Изменяемые типы (список, словарь, множество) хешируемыми не бывают именно поэтому.
Что можно класть в множество / использовать как ключ словаря
Обычно хешируемы
int, float, str
bool, bytes
tuple — если все элементы тоже хешируемы
frozenset
Не хешируемы
list
dict
set

frozenset — неизменяемое множество

frozenset_primer.py
zamorozhennoe = frozenset({"python", "git"})
print(zamorozhennoe)
# zamorozhennoe.add("docker")  # AttributeError — метода add() нет
Когда пригодится frozenset
frozenset нужен, когда множество само должно быть хешируемым — например, чтобы использовать его как элемент другого множества или как ключ словаря, что с обычным set невозможно.
Практика: алгебра множеств, подмножества, хешируемость
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →