Menu
Русский

Множества в Python: уникальные элементы, объединение, пересечение и разность

Когда тянуться за множеством — уникальность, быстрые проверки in и математические операции (объединение, пересечение, разность), которые делают множества мощными.

Множество — неупорядоченный мешок уникальных элементов

Списки и кортежи заботятся о порядке, множества — нет. Списки позволяют дубликатам накапливаться, множества молча их отбрасывают. Множество — правильная структура данных, когда у тебя две конкретные потребности:

  1. Нужна уникальность, без вариантов.
  2. Нужна быстрая проверка принадлежности.

Пиши через фигурные скобки:

main.py
Output
Click Run to see the output here.

Дубликаты "red" и "green" во втором множестве просто исчезают. Это не ошибка — это вся суть.

Создание множеств

Два способа, которыми ты реально будешь пользоваться:

main.py
Output
Click Run to see the output here.

Последний пункт ловит каждого один раз: {} создаёт пустой словарь, а не пустое множество. Синтаксическая двусмысленность должна была упасть на что-то одно, и победил словарь.

Добавление и удаление

main.py
Output
Click Run to see the output here.

Ключевое различие remove и discard: remove настаивает, что элемент должен быть в множестве; discard — всё равно. Выбирай по тому, должно ли отсутствие элемента быть ошибкой.

Быстрая принадлежность

Вот где множества по-настоящему зарабатывают себе место. x in some_set работает за константное время независимо от размера множества. x in some_list должен пройти по списку, что становится медленным на больших размерах.

main.py
Output
Click Run to see the output here.

Правило большого пальца: если пишешь if x in some_list внутри цикла, и в списке больше нескольких десятков элементов, — сначала преобразуй список в множество.

Множественная математика

Здесь множества становятся по-настоящему интересными. Их можно комбинировать операторами, зеркалящими математические операции над множествами:

main.py
Output
Click Run to see the output here.

У каждого оператора есть и метод-эквивалент (.union(), .intersection(), .difference(), .symmetric_difference()). Операторы компактнее; методы принимают любой итерируемый объект, а не только другое множество.

Удаление дубликатов из списка

Одно из самых частых применений множеств, даже вне «логики множеств»:

main.py
Output
Click Run to see the output here.

Одна строка, дубликаты исчезли. Но обрати внимание: порядок не сохраняется. Если нужна и уникальность, и исходный порядок — используй dict.fromkeys():

main.py
Output
Click Run to see the output here.

Словари в современном Python сохраняют порядок вставки, а dict.fromkeys строит словарь, используя элементы итерируемого как ключи — фактически упорядоченное множество.

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

Проверка, содержится ли одно множество в другом:

main.py
Output
Click Run to see the output here.

Это всплывает в чём-то вроде проверки прав («есть ли у пользователя все необходимые роли?»).

Что можно положить в множество

Только хэшируемые элементы. Это технический термин — на практике он означает:

  • Неизменяемые вещи хэшируемы: числа, строки, кортежи из хэшируемых, frozenset.
  • Изменяемые — нет: списки, словари, другие множества элементами множества быть не могут.
main.py
Output
Click Run to see the output here.

Нужно множество множеств — используй frozenset, это неизменяемая версия set.

Итерация — без порядка

Проход по множеству даёт элементы без гарантированного порядка:

main.py
Output
Click Run to see the output here.

Запусти несколько раз — увидишь, что порядок меняется. Если порядок важен, множество — не та структура; сортируй содержимое, когда нужен порядок, или используй список.

Когда множество не подходит

Если верно хоть одно из этого — лучше список или словарь:

  • Важен порядок.
  • Нужно хранить дубликаты.
  • У каждого элемента есть связанные данные (возьми словарь с элементом-ключом).

Дальше

Множества отвечают за уникальность и принадлежность. Словари — следующие — отвечают за более широкий паттерн «ищи значение по ключу», и это, пожалуй, самая полезная не-списковая структура данных в Python.

Часто задаваемые вопросы

Что такое множество в Python?

Множество — это неупорядоченная коллекция уникальных элементов. Множества пишутся фигурными скобками без пар ключ-значение: colors = {'red', 'green', 'blue'}. Добавление одного и того же значения дважды ни на что не влияет — дубликаты молча отбрасываются.

Когда выбирать множество вместо списка?

Когда важна уникальность или ты часто делаешь проверку принадлежности (x in collection). Множества автоматически убирают дубликаты и проверяют принадлежность за константное время — на больших коллекциях это огромный прирост по сравнению со списками.

Как создать пустое множество в Python?

Используй set(), не {} — пустые фигурные скобки создают пустой словарь, а не пустое множество. А как только множество есть, элементы добавляются через .add(value).

Учитесь программировать с Coddy

НАЧАТЬ