Статьи

Учебные материалы по языку Python — от основ до продвинутых тем

set и frozenset

Страница 28 из 34 · 2026-10-26 · 3 мин чтения

Создание

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. Проверьте, что в списке нет повторяющихся элементов, без сортировки.
  3. Объясните, почему {[1, 2]} вызывает ошибку, а {(1, 2)} — нет.