Основы работы: как пополнить множество
Основные способы добавления элементов в множество
Метод add() - основной способ вставки одного элемента. Он принимает один аргумент (должен быть хешируемого типа) и изменяет множество, ничего не возвращая. Если элемент уже существует, множество остаётся без изменений.
my_set = {1, 2, 3}
my_set.add(5)
print(my_set)добавить данные в список python (добавление данных в список в python)
{1, 2, 3, 5}Python добавить ключ (добавление ключа в словарь в python)
Ошибка: попытка добавить нехешируемый объект (список, словарь, другое множество) вызывает TypeError: unhashable type. Например: my_set.add([10, 20]) приведёт к ошибке.
Решение: для добавления нескольких элементов используйте update() или добавляйте кортежи / frozenset, которые хешируемы.
Как добавить несколько элементов за один вызов?
Метод update() принимает одно или несколько итерируемых объектов (список, множество, строку, кортеж) и добавляет все элементы из них в исходное множество. Дубликаты игнорируются.
my_set = {1, 2}
my_set.update([3, 4], (5, 6), "ab")
print(my_set)Python добавить в множество (добавление элемента в множество в python)
{1, 2, 3, 4, 5, 6, 'a', 'b'}создание множества python (создание множества (set) в python)
Типичная ошибка: передача строки "ab" добавляет символы по одному. Если нужно добавить целую строку как один элемент, её следует поместить в другой итерируемый объект: my_set.update(["ab"]).
Как объединить два множества без изменения исходного?
Оператор | (или метод union()) создаёт новое множество, содержащее элементы обоих. Исходные не изменяются. Это не «добавление» в уже существующее, но полезно для создания комбинации.
a = {1, 2}
b = {2, 3}
c = a | b
print(c)создание словаря в python (создание словаря в python)
{1, 2, 3}создание массивов python (создание списков/массивов в python)
Если нужно изменить одно из множеств, используйте оператор присваивания |= (аналог метода update() с множеством в аргументе). a |= b изменит a, добавив элементы b.
Как добавить элемент только если его ещё нет?
Проверка in перед add() годится, когда необходимо выполнить дополнительные действия в случае отсутствия элемента. Однако add() сам игнорирует дубликаты, поэтому проверка избыточна для простого добавления. Она полезна, когда нужно, например, вести счётчик.
my_set = {1, 2, 3}
if 4 not in my_set:
my_set.add(4)
print("Элемент 4 добавлен")
print(my_set)
Элемент 4 добавлен
{1, 2, 3, 4}
Внимание: проверка in на множестве выполняется за O(1), но дважды - в условии и при add - это лишняя работа, если не требуется логика «если нет, то…».
Как добавить в множество другое множество как один элемент?
Обычное множество нехешируемо, поэтому непосредственно добавить его нельзя. Вместо этого используется frozenset - неизменяемый аналог, который можно хранить как элемент.
my_set = {frozenset({1, 2}), frozenset({3, 4})}
new_set = frozenset({5, 6})
my_set.add(new_set)
print(my_set)
{frozenset({1, 2}), frozenset({3, 4}), frozenset({5, 6})}
Исключение: попытка my_set.add({7, 8}) вызовет TypeError. Используйте frozenset для вложенных множеств.
Расширенные примеры и нестандартные ситуации
Добавление элементов из нескольких источников
Метод update() принимает любое число итерируемых объектов. Ниже - комбинация списка, кортежа и генератора.
s = {0}
s.update([1, 2], (3,), x*2 for x in range(4, 6))
print(s)
{0, 1, 2, 3, 8, 10}
Добавление с помощью генератора множества (set comprehension)
Создаётся новое множество на основе существующего с преобразованием или фильтрацией. Например, добавление квадратов чисел из списка (но это не изменение исходного, а создание нового).
numbers = [1, 2, 3, 4]
squares_set = {n**2 for n in numbers}
print(squares_set)
{16, 1, 4, 9}
Попытка добавить список (ошибка и обработка)
Можно перехватить TypeError и преобразовать список в кортеж.
my_set = {1, 2}
try:
my_set.add([3, 4])
except TypeError:
my_set.add(tuple([3, 4]))
print(my_set)
{1, 2, (3, 4)}
Добавление содержимого текстового файла в множество
Построчное чтение - каждая строка (с символом новой строки или без) становится элементом.
with open('data.txt', 'w') as f:
f.write('apple\nbanana\napple\ncherry\n')
with open('data.txt') as f:
unique_lines = set(line.strip() for line in f)
print(unique_lines)
{'apple', 'banana', 'cherry'}
Добавление элементов с помощью map и set
Комбинация map и set для преобразования и уникализации.
words = ['hello', 'world', 'hello']
unique_upper = set(map(str.upper, words))
print(unique_upper)
{'HELLO', 'WORLD'}
Изменение множества во время итерации (ошибка и обход)
Не допускается изменять размер множества во время прямого цикла. Для безопасного удаления / добавления копируют элементы.
my_set = {1, 2, 3, 4, 5}
to_add = {10, 20}
# Ошибка: RuntimeError: Set changed size during iteration
# for x in my_set:
# if x % 2 == 0:
# my_set.update(to_add)
# Правильно: копируем копию
for x in list(my_set):
if x % 2 == 0:
my_set.update(to_add)
print(my_set)
{1, 2, 3, 4, 5, 10, 20}
Добавление кортежа, содержащего список (ошибка хеша)
Кортеж хешируем, только если все его элементы хешируемы. Кортеж со списком - нет.
my_set = set()
# Ошибка: TypeError: unhashable type: 'list'
# my_set.add((1, [2, 3]))
# Решение: заменить список на кортеж
my_set.add((1, (2, 3)))
print(my_set)
{(1, (2, 3))}
Добавление frozenset в set для создания множества множеств
Позволяет хранить наборы как элементы.
s = set()
s.add(frozenset({1, 2}))
s.add(frozenset({3, 4}))
s.add(frozenset({1, 2})) # дубликат не добавится
print(s)
{frozenset({1, 2}), frozenset({3, 4})}
Оператор |= для добавления из нескольких множеств
Эквивалентен update() с одним множеством, но можно передать несколько объектов через цепочку |=.
a = {1, 2}
b = {3}
c = {4}
a |= b |= c
print(a)
{1, 2, 3, 4}