Все разделы
Выбрать школу

Школа. Увлечения. Большое будущее.

PROSCHOOLS · ОБРАЗОВАНИЕ РЯДОМ

Ваш город

Выберите город, чтобы находить образование и возможности рядом.

Как учитываем городКаталог и кнопки «Выбрать школу» покажут школы выбранного города.Онлайн-курсы, учебник, ГДЗ и задания к экзаменам доступны по всей России.

Популярные города

Будет выбран: Вся Россия

Учебные материалы останутся прежними.

Поиск по сайту

По всему сайтуШколы выбранного города — выше в результатах

С чего начнём?

↑ ↓ — выбрать результат · Enter — открыть · Esc — закрыть

Множества: уникальные элементы и операции над ними

💻 Информатика · 9 класс

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

Клавиатура в компьютерном классе
Иллюстрация к предмету «Информатика»Hmartil · Wikimedia Commons · CC BY-SA 4.0

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

Множество (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 guests

add добавляет элемент, если его ещё нет. 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 равны, обе разности пусты.

Типичные ошибки

  1. Путать set и dict: {} — это словарь, пустое множество — set().
  2. Полагаться на порядок печати множества — используйте sorted.
  3. Элементы должны быть хешируемыми. Список и кортеж со списком внутри не подходят — возникнет TypeError; frozenset является неизменяемым хешируемым множеством.

У множества нет позиционных индексов: guests[0] не означает «первый гость». Чтобы безопасно изменить состав во время обработки, сначала составьте отдельный набор изменений либо перебирайте копию: изменение размера исходного set при его обходе может вызвать RuntimeError.

Проверь себя

  1. Что вернёт sorted(set(['м', 'а', 'м', 'а']))? Ответ: ['а', 'м'] — повторы исчезли, порядок задал sorted.
  2. Чему равно {1, 2, 3} & {2, 3, 4}? Ответ: {2, 3} — пересечение.
  3. Чему равно {1, 2} - {2, 3} и {2, 3} - {1, 2}? Ответ: {1} и {3}: разность несимметрична.
  4. Как удалить элемент, не проверяя его наличие заранее? Ответ: метод discard — он не выбросит ошибку при отсутствии элемента.

Кратко о главном

Множество — уникальные элементы без гарантии порядка. Оно быстро отвечает на in и поддерживает операции &, |, -, ^. Для упорядоченного вывода сравнимых элементов применяйте sorted, а пустое множество создавайте через set().

Связанные материалы

Источники и материалы