Множество: создание и проверка принадлежности
Уроки курсаМножество: создание и проверка принадлежности
Изменение множества: 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() в сценариях, где наличие элемента заранее неизвестно.
