Множество — неупорядоченный мешок уникальных элементов
Списки и кортежи заботятся о порядке, множества — нет. Списки позволяют дубликатам накапливаться, множества молча их отбрасывают. Множество — правильная структура данных, когда у тебя две конкретные потребности:
- Нужна уникальность, без вариантов.
- Нужна быстрая проверка принадлежности.
Пиши через фигурные скобки:
Дубликаты "red" и "green" во втором множестве просто исчезают. Это не ошибка — это вся суть.
Создание множеств
Два способа, которыми ты реально будешь пользоваться:
Последний пункт ловит каждого один раз: {} создаёт пустой словарь, а не пустое множество. Синтаксическая двусмысленность должна была упасть на что-то одно, и победил словарь.
Добавление и удаление
Ключевое различие remove и discard: remove настаивает, что элемент должен быть в множестве; discard — всё равно. Выбирай по тому, должно ли отсутствие элемента быть ошибкой.
Быстрая принадлежность
Вот где множества по-настоящему зарабатывают себе место. x in some_set работает за константное время независимо от размера множества. x in some_list должен пройти по списку, что становится медленным на больших размерах.
Правило большого пальца: если пишешь if x in some_list внутри цикла, и в списке больше нескольких десятков элементов, — сначала преобразуй список в множество.
Множественная математика
Здесь множества становятся по-настоящему интересными. Их можно комбинировать операторами, зеркалящими математические операции над множествами:
У каждого оператора есть и метод-эквивалент (.union(), .intersection(), .difference(), .symmetric_difference()). Операторы компактнее; методы принимают любой итерируемый объект, а не только другое множество.
Удаление дубликатов из списка
Одно из самых частых применений множеств, даже вне «логики множеств»:
Одна строка, дубликаты исчезли. Но обрати внимание: порядок не сохраняется. Если нужна и уникальность, и исходный порядок — используй dict.fromkeys():
Словари в современном Python сохраняют порядок вставки, а dict.fromkeys строит словарь, используя элементы итерируемого как ключи — фактически упорядоченное множество.
Подмножества и надмножества
Проверка, содержится ли одно множество в другом:
Это всплывает в чём-то вроде проверки прав («есть ли у пользователя все необходимые роли?»).
Что можно положить в множество
Только хэшируемые элементы. Это технический термин — на практике он означает:
- Неизменяемые вещи хэшируемы: числа, строки, кортежи из хэшируемых, frozenset.
- Изменяемые — нет: списки, словари, другие множества элементами множества быть не могут.
Нужно множество множеств — используй frozenset, это неизменяемая версия set.
Итерация — без порядка
Проход по множеству даёт элементы без гарантированного порядка:
Запусти несколько раз — увидишь, что порядок меняется. Если порядок важен, множество — не та структура; сортируй содержимое, когда нужен порядок, или используй список.
Когда множество не подходит
Если верно хоть одно из этого — лучше список или словарь:
- Важен порядок.
- Нужно хранить дубликаты.
- У каждого элемента есть связанные данные (возьми словарь с элементом-ключом).
Дальше
Множества отвечают за уникальность и принадлежность. Словари — следующие — отвечают за более широкий паттерн «ищи значение по ключу», и это, пожалуй, самая полезная не-списковая структура данных в Python.
Часто задаваемые вопросы
Что такое множество в Python?
Множество — это неупорядоченная коллекция уникальных элементов. Множества пишутся фигурными скобками без пар ключ-значение: colors = {'red', 'green', 'blue'}. Добавление одного и того же значения дважды ни на что не влияет — дубликаты молча отбрасываются.
Когда выбирать множество вместо списка?
Когда важна уникальность или ты часто делаешь проверку принадлежности (x in collection). Множества автоматически убирают дубликаты и проверяют принадлежность за константное время — на больших коллекциях это огромный прирост по сравнению со списками.
Как создать пустое множество в Python?
Используй set(), не {} — пустые фигурные скобки создают пустой словарь, а не пустое множество. А как только множество есть, элементы добавляются через .add(value).