Глава 11 · Очень много информации!
Операции множеств и хешируемость
Четыре операции алгебры множеств на Венн-диаграммах — и почему список нельзя положить внутрь множества.
Множества как круги на диаграмме Венна
Две группы участников курсов — удобный пример, на котором видно все четыре операции сразу:
dve_gruppy.py
python_users = ['Anna', 'Bob', 'Maria']
data_users = ['Bob', 'Li']
Объединение — union, |
Anna
Maria
Bob
Li
→ {'Anna', 'Bob', 'Maria', 'Li'}
union.py
print(set(python_users) | set(data_users))
Пересечение — intersection, &
Anna
Maria
Bob
Li
→ {'Bob'}
intersection.py
print(set(python_users) & set(data_users))
Разность — difference, -
Anna
Maria
Bob
Li
→ {'Anna', 'Maria'}
difference.py
print(set(python_users) - set(data_users))
Симметричная разность — symmetric_difference, ^
Anna
Maria
Bob
Li
→ {'Anna', 'Maria', 'Li'}
symmetric_difference.py
print(set(python_users) ^ set(data_users))
| Операция | Оператор | Метод |
|---|---|---|
| объединение | a | b | a.union(b) |
| пересечение | a & b | a.intersection(b) |
| разность | a - b | a.difference(b) |
| симметричная разность | a ^ b | a.symmetric_difference(b) |
Подмножество и надмножество
podmnozhestvo.py
required = {"python", "git"}
available = {"python", "git", "docker", "linux"}
print(required <= available) # True — required ЦЕЛИКОМ входит в available
print(required.issubset(available)) # то же самое
python
git
docker
linux
| Оператор / метод | Значение |
|---|---|
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, без установки