Python для новичковКоллекцииМножество: создание и проверка принадлежности

Множество: создание и проверка принадлежности

Уроки курсаМножество: создание и проверка принадлежности

Изменение множества: add(), discard() и безопасное удаление

Множество не статично: после создания в него можно добавлять и удалять элементы. Для этого есть два метода — add() и discard().

add() добавляет элемент в множество. Если элемент уже есть, ничего не происходит — никакой ошибки, множество просто остаётся прежним:

visited = {"Москва", "Казань"}
visited.add("Питер")
print(visited)  # {'Москва', 'Казань', 'Питер'}

visited.add("Москва")  # уже есть
print(visited)  # {'Москва', 'Казань', 'Питер'} — без изменений

Вот здесь уникальность работает на практике: add() не создаёт дубликат, даже если вызвать его несколько раз с одним и тем же значением.

discard() удаляет элемент из множества. Ключевое слово — «безопасно»: если элемента нет, метод молча ничего не делает:

visited.discard("Казань")
print(visited)  # {'Москва', 'Питер'}

visited.discard("Новосибирск")  # такого нет в множестве
print(visited)  # {'Москва', 'Питер'} — никакой ошибки

Такое поведение принципиально отличает discard() от remove(). Метод remove() есть и у множества, и у списка — но при попытке удалить несуществующий элемент он бросает исключение:

visited.remove("Новосибирск")  # KeyError: 'Новосибирск'

Это не значит, что remove() плохой — просто у него другая задача. Если хочешь гарантированно получить ошибку при отсутствии элемента (например, чтобы отловить логический баг), используй remove(). Если хочешь просто «убрать, если есть» — используй discard().

Аналогия со списком помогает быстро запомнить разницу: append() добавляет в конец списка, add() добавляет в множество. remove() у списка тоже падает с ошибкой при отсутствии элемента — discard() это исправляет специально для множеств.

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

wishlist = set()
wishlist.add("Берлин")
wishlist.add("Токио")
wishlist.add("Берлин")   # повтор — игнорируется
wishlist.discard("Токио") # передумал
wishlist.discard("Рим")   # не было — не падает
print(wishlist)  # {'Берлин'}

Весь блок работает без ошибок, даже если данные приходят непоследовательно. Именно за это и ценят discard() в сценариях, где наличие элемента заранее неизвестно.