Основы работы: как пополнить множество

Раздел: Основы Python -> Работа со структурами данных

Основные способы добавления элементов в множество

Метод 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}

Добавление элемента в множество в Python - comments

En
Python добавить в множество (python)