Добавление элементов в множество
Как добавлять элементы в множество Python с помощью add() и update(): примеры и советы.
Множества Python — это неупорядоченные коллекции уникальных элементов. После создания множество можно расширять в любой момент с помощью двух специальных методов: add() для вставки одного элемента и update() для вставки сразу нескольких элементов из любого итерируемого объекта. В этой главе подробно рассматриваются оба метода, объясняется, когда какой из них использовать, и перечисляются распространённые подводные камни.
Если вы только начинаете знакомство с множествами, сначала прочитайте главу Python Sets. Чтобы узнать, как удалять элементы, смотрите Remove Set Items.
Метод add()
add() вставляет один элемент в множество. Если элемент уже существует, множество не изменяется — ошибка не возникает и дубликат не создаётся.
Синтаксис
set.add(element)element— значение для вставки. Оно должно быть хешируемым (string, число, tuple из хешируемых значений и т. д.). Списки и словари добавить нельзя.- Возвращаемое значение:
None. Множество изменяется на месте.
Добавление нового элемента
Добавление string в множество
Добавление дубликата безопасно
Вызов add() с элементом, который уже присутствует в множестве, ничего не меняет — размер множества остаётся прежним:
Добавление дублирующего элемента в множество
fruits = {'apple', 'banana', 'cherry'}
fruits.add('apple') # 'apple' is already present
print(fruits)
# {'apple', 'banana', 'cherry'} (unchanged)Это одно из наиболее полезных свойств множеств: перед добавлением не нужно проверять, существует ли элемент.
add() принимает только один аргумент
add() принимает ровно один аргумент. Чтобы вставить несколько элементов сразу, используйте update() (см. следующий раздел).
# This raises TypeError: set.add() takes exactly one argument (2 given)
# fruits.add('kiwi', 'mango')add() требует хешируемый элемент
В множестве могут храниться только хешируемые типы. Списки и словари не являются хешируемыми, поэтому передача их в add() вызывает TypeError:
s = {1, 2, 3}
# s.add([4, 5]) # TypeError: unhashable type: 'list'
# Use a tuple instead:
s.add((4, 5))
print(s)
# {1, 2, 3, (4, 5)}Метод update()
update() добавляет все элементы из одного или нескольких итерируемых объектов в множество за один вызов. Метод принимает любой итерируемый объект — другое множество, список, tuple или даже string.
Синтаксис
set.update(iterable1, iterable2, ...)- Можно передать один или несколько итерируемых объектов.
- Дубликаты между существующим множеством и новыми элементами молча игнорируются.
- Возвращаемое значение:
None. Множество изменяется на месте.
Добавление элементов из списка
Обновление множества из списка
fruits = {'apple', 'banana'}
fruits.update(['cherry', 'date', 'elderberry'])
print(fruits)
# {'apple', 'banana', 'cherry', 'date', 'elderberry'}Добавление элементов из другого множества
Объединение двух множеств с помощью update()
set1 = {1, 2, 3}
set2 = {3, 4, 5}
set1.update(set2)
print(set1)
# {1, 2, 3, 4, 5}Обратите внимание: update() изменяет set1 на месте, тогда как union() возвращает новое множество, не затрагивая ни одно из исходных.
Добавление из нескольких итерируемых объектов за один раз
Можно передать несколько итерируемых объектов в один вызов update():
Обновление множества из нескольких итерируемых объектов
numbers = {1, 2, 3}
numbers.update([4, 5], {5, 6, 7})
print(numbers)
# {1, 2, 3, 4, 5, 6, 7}Передача string в update()
Поскольку string является итерируемым объектом, update() разбивает его на отдельные символы. Обычно это нежелательное поведение, поэтому будьте осторожны:
Обновление с помощью string — добавляются отдельные символы
s = {'hello'}
s.update('abc')
print(s)
# {'hello', 'a', 'b', 'c'} — each character becomes a separate elementЧтобы добавить целую string как один элемент, используйте add().
add() vs update() — Краткое сравнение
add() | update() | |
|---|---|---|
| Количество элементов | Один | Много |
| Тип аргумента | Одно хешируемое значение | Любой итерируемый объект (список, множество, tuple, …) |
| Изменяет множество на месте? | Да | Да |
| Возвращает | None | None |
Практические примеры
Динамическое построение набора тегов
Распространённый сценарий — накопление уникальных тегов или идентификаторов в процессе работы программы:
Сбор уникальных тегов с помощью множества
tags = set()
# add() for one tag at a time
tags.add('python')
tags.add('tutorial')
tags.add('python') # duplicate — ignored
print(tags)
# {'python', 'tutorial'}
# update() to add several tags at once
tags.update(['coding', 'beginner', 'tutorial'])
print(tags)
# {'python', 'tutorial', 'coding', 'beginner'}Удаление дубликатов при накоплении данных
Поскольку add() молча игнорирует дубликаты, множество можно использовать как аккумулятор для дедупликации элементов из нескольких источников:
Дедупликация элементов из двух списков с помощью множества
batch1 = [101, 102, 103, 102]
batch2 = [103, 104, 105]
seen = set()
seen.update(batch1)
seen.update(batch2)
print(sorted(seen))
# [101, 102, 103, 104, 105]Ключевые моменты
- Множества хранят только уникальные элементы;
add()иupdate()никогда не создают дубликатов. - Множества неупорядочены — порядок вставки не сохраняется и может различаться между запусками.
add()вставляет ровно один хешируемый элемент;update()вставляет все элементы из любого количества итерируемых объектов.- Оба метода возвращают
Noneи изменяют множество на месте. - Чтобы объединить два множества в новое множество, не изменяя ни одно из них, используйте
union()(см. Set Methods).