Множества: уникальные элементы и операции над ними
💻 Информатика · 9 класс
Множество хранит только уникальные элементы и умеет отвечать на вопросы «есть ли в обоих», «только здесь», «хотя бы где-то». Разберём создание, методы add/discard и операции &, |, -, ^.

Что такое множество
Множество (set) — коллекция уникальных элементов без повторов. Она отвечает на вопросы вида «встречался ли элемент», «что общего у двух наборов». Создать множество можно фигурными скобками с элементами: guests = {'Аня', 'Борис'}, или из списка: set(entries). Важная ловушка: обычная запись пустого множества — set() — фигурные скобки без элементов {} создадут пустой словарь.
Пример 1. Список гостей без повторов
На входе журнал регистрации, где имена повторяются. Преобразование в множество убирает повторяющиеся значения. Одинаковое имя здесь считается одной записью; для реальных однофамильцев или тёзок нужны разные идентификаторы.
def guest_list(entries):
return sorted(set(entries))
entries = ['Аня', 'Борис', 'Аня', 'Вера', 'Борис', 'Аня']
print(guest_list(entries)) # ['Аня', 'Борис', 'Вера']Почему sorted? Потому что порядок элементов множества не гарантирован: документация прямо предупреждает, что вывод может идти в ином порядке, чем ожидаешь. Для воспроизводимого результата множество превращают в отсортированный список. Если требуется определённый порядок строк, задайте его явно. В этом примере все элементы — строки, поэтому их можно сортировать напрямую.
Методы: add и discard
def add_guest(guests, name):
before = len(guests)
guests.add(name)
return len(guests) > before # True, если гость новый
def remove_guest(guests, name):
guests.discard(name) # не падает, если гостя не было
return guestsadd добавляет элемент, если его ещё нет. discard удаляет, а при отсутствии элемента молча ничего не делает; метод remove вёл бы себя иначе — выбросил бы KeyError. Для проверки «есть ли элемент» используйте in — для обычных хешируемых элементов это удобный способ проверки принадлежности.
Пример 2. Олимпиадные предметы двух школ
Пусть школа А выставила команды по математике, физике и информатике, школа Б — по физике, химии и информатике.
def olympiad_teams(school_a, school_b):
return sorted(set(school_a) & set(school_b))
def not_shared(school_a, school_b):
return sorted(set(school_a) ^ set(school_b))
a = ['математика', 'физика', 'информатика']
b = ['физика', 'химия', 'информатика']
print(olympiad_teams(a, b)) # ['информатика', 'физика']
print(not_shared(a, b)) # ['математика', 'химия']Четыре операции-множества: пересечение & (есть в обоих), объединение | (хотя бы в одном), разность - (в первом, но не во втором), симметричная разность ^ (только в одном из двух). Порядок операндов важен для разности: a - b и b - a в общем случае могут различаться. Если a и b равны, обе разности пусты.
Типичные ошибки
- Путать set и dict: {} — это словарь, пустое множество — set().
- Полагаться на порядок печати множества — используйте sorted.
- Элементы должны быть хешируемыми. Список и кортеж со списком внутри не подходят — возникнет TypeError; frozenset является неизменяемым хешируемым множеством.
У множества нет позиционных индексов: guests[0] не означает «первый гость». Чтобы безопасно изменить состав во время обработки, сначала составьте отдельный набор изменений либо перебирайте копию: изменение размера исходного set при его обходе может вызвать RuntimeError.
Проверь себя
- Что вернёт sorted(set(['м', 'а', 'м', 'а']))? Ответ: ['а', 'м'] — повторы исчезли, порядок задал sorted.
- Чему равно {1, 2, 3} & {2, 3, 4}? Ответ: {2, 3} — пересечение.
- Чему равно {1, 2} - {2, 3} и {2, 3} - {1, 2}? Ответ: {1} и {3}: разность несимметрична.
- Как удалить элемент, не проверяя его наличие заранее? Ответ: метод discard — он не выбросит ошибку при отсутствии элемента.
Кратко о главном
Множество — уникальные элементы без гарантии порядка. Оно быстро отвечает на in и поддерживает операции &, |, -, ^. Для упорядоченного вывода сравнимых элементов применяйте sorted, а пустое множество создавайте через set().