Тип данных set: создание, операции и практические примеры

Раздел: Типы данных -> Коллекции

Работа с множествами в Python

Как создать множество в Python?

Множество (set) представляет неупорядоченную коллекцию уникальных элементов. Основной способ создания - использование фигурных скобок {} или встроенной функции set(). Фигурные скобки с пустыми элементами создают словарь, поэтому для пустого множества применяется set().

# Создание множества с элементами
my_set = {1, 2, 3, 4, 5}
print(my_set)  # {1, 2, 3, 4, 5}

# Пустое множество
empty_set = set()
print(type(empty_set))  # 

Python set list (set и list в python: различия и использование)

Важно:

Элементы множества должны быть хешируемыми (неизменяемыми). Список, словарь или другое множество добавить нельзя.

Какие есть альтернативные способы создания множества?

Множество можно создать из любого итерируемого объекта (список, строка, кортеж) с помощью set(). Это удобно для удаления дубликатов.

# Из списка
numbers = [1, 2, 2, 3, 4, 4, 5]
unique = set(numbers)
print(unique)  # {1, 2, 3, 4, 5}

# Из строки
chars = set('hello')
print(chars)  # {'h', 'e', 'l', 'o'}

# Из диапазона
range_set = set(range(10))
print(range_set)  # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

Python пары значений (пары значений в python)

Как создать множество с помощью генератора?

Генераторные выражения (set comprehensions) позволяют создавать множества по правилам.

squares = {x**2 for x in range(5)}
print(squares)  # {0, 1, 4, 9, 16}

even_squares = {x**2 for x in range(10) if x % 2 == 0}
print(even_squares)  # {0, 4, 16, 36, 64}

Python object get (метод get для объектов в python)

Почему возникает TypeError: unhashable type при добавлении списка?

Множество хранит элементы по хешу, поэтому все элементы должны быть неизменяемыми (хешируемыми). Список, словарь или другое множество изменяемы и не могут быть добавлены.

# Ошибка - список не хешируемый
my_set = {[1, 2]}  # TypeError: unhashable type: 'list'

# Правильно - использовать кортеж
my_set = {(1, 2), (3, 4)}
print(my_set)  # {(1, 2), (3, 4)}

Python get keys (метод get для словарей в python)

Решение:

Для хранения изменяемых коллекций используйте frozenset (неизменяемую версию множества) или кортежи.

Как добавить элемент в множество?

Метод add() добавляет один элемент. Если элемент уже существует, множество не меняется.

s = {1, 2, 3}
s.add(4)
print(s)  # {1, 2, 3, 4}
s.add(2)  # ничего не произойдёт
print(s)  # {1, 2, 3, 4}

Get index python (метод index в python)

Как добавить несколько элементов за раз?

Метод update() принимает итерируемый объект и добавляет все его уникальные элементы.

s = {1, 2}
s.update([3, 4, 5])
print(s)  # {1, 2, 3, 4, 5}
s.update({6, 7}, 'ab')
print(s)  # {1, 2, 3, 4, 5, 6, 7, 'a', 'b'}

Python get methods (методы get в python)

Как удалить элемент из множества?

Метод remove() удаляет элемент, но вызывает KeyError, если его нет. discard() удаляет без ошибки.

s = {1, 2, 3, 4}
s.remove(3)
print(s)  # {1, 2, 4}
# s.remove(10)  # KeyError: 10
s.discard(10)  # нет ошибки
print(s)  # {1, 2, 4}

Python длина списка (длина списка и массива в python)

Как удалить случайный элемент?

Метод pop() удаляет и возвращает произвольный элемент. Если множество пустое - KeyError.

s = {100, 200, 300}
removed = s.pop()
print(removed)  # может быть 100, 200 или 300
print(s)        # оставшиеся элементы

словарь данных python (словарь данных в python)

Что делать, если нужно очистить множество?

Метод clear() удаляет все элементы.

s = {1, 2, 3}
s.clear()
print(s)  # set()

типы данных python кортеж (кортеж (tuple) в python)

Как проверить принадлежность элемента множеству?

Оператор in возвращает True или False. Эта операция выполняется за O(1) в среднем.

s = {10, 20, 30}
print(20 in s)   # True
print(40 in s)   # False

Python типы данных set (множество (set) в python)

Как выполнить базовые операции теории множеств: объединение, пересечение, разность?

Python поддерживает операторы и методы для работы с множествами.

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

# Объединение
print(a | b)  # {1, 2, 3, 4, 5, 6}
print(a.union(b))

# Пересечение
print(a & b)  # {3, 4}
print(a.intersection(b))

# Разность (элементы a, которых нет в b)
print(a - b)  # {1, 2}
print(a.difference(b))

# Симметрическая разность (элементы в одном из множеств, но не в обоих)
print(a ^ b)  # {1, 2, 5, 6}
print(a.symmetric_difference(b))

Как проверить, является ли одно множество подмножеством другого?

Методы issubset() и issuperset().

a = {1, 2}
b = {1, 2, 3, 4}
print(a.issubset(b))   # True
print(b.issuperset(a)) # True
print(a <= b)          # True (оператор)
print(a < b)           # True (строгое подмножество)

Почему при копировании множества изменения отражаются на обеих переменных?

Простое присваивание s2 = s1 не создаёт копию, а новую ссылку на тот же объект. Для независимой копии используйте copy() или set(s1).

s1 = {1, 2, 3}
# Неправильно
s2 = s1
s2.add(4)
print(s1)  # {1, 2, 3, 4} - изменилось

# Правильно
s3 = s1.copy()
s3.add(5)
print(s1)  # {1, 2, 3, 4} - без изменений
print(s3)  # {1, 2, 3, 4, 5}

Какие ещё полезные методы есть у множеств?

Метод difference_update(), intersection_update(), symmetric_difference_update() - изменяют само множество, а не возвращают новое.

a = {1, 2, 3, 4}
b = {3, 4, 5}
a.difference_update(b)
print(a)  # {1, 2}

Метод isdisjoint() - проверяет, нет ли общих элементов.

a = {1, 2}
b = {3, 4}
print(a.isdisjoint(b))  # True

Расширенные примеры работы с множествами

1. Удаление дубликатов из списка с сохранением порядка

Простой set переставляет элементы произвольно. Если нужен исходный порядок, используют dict.fromkeys() или OrderedDict (устарел) - но можно и set combos с сортировкой. Пример с сохранением порядка:

Пример
items = [3, 1, 2, 1, 2, 3, 4]
seen = set()
unique_ordered = []
for x in items:
    if x not in seen:
        seen.add(x)
        unique_ordered.append(x)
print(unique_ordered)  # [3, 1, 2, 4]

2. Использование замороженного множества (frozenset)

frozenset - неизменяемый аналог set, может быть элементом другого множества или ключом словаря.

Пример
fs1 = frozenset([1, 2, 3])
fs2 = frozenset([4, 5])
set_of_frozen = {fs1, fs2}
print(set_of_frozen)  # {frozenset({1, 2, 3}), frozenset({4, 5})}

dict_with_frozen_key = {fs1: "abc"}
print(dict_with_frozen_key)  # {frozenset({1, 2, 3}): 'abc'}

3. Set comprehension со сложной логикой

Пример
# Все уникальные длины слов в строке
text = "python set example unique elements"
lengths = {len(word) for word in text.split()}
print(lengths)  # {3, 4, 5, 6, 8}

# Комбинация двух условий
result = {x*y for x in range(1, 6) for y in range(1, 6) if x != y}
print(result)  # {2, 3, 4, 5, 6, 8, 10, 12, 15, 20}

4. Эффективная проверка на уникальность в циклах

Пример
# Проверка, есть ли дубликаты в последовательности
def has_duplicates(seq):
    return len(seq) != len(set(seq))

print(has_duplicates([1,2,3]))    # False
print(has_duplicates([1,2,2,3]))  # True

5. Операции над множествами с несколькими операндами

Пример
a = {1, 2, 3}
b = {2, 3, 4}
c = {3, 4, 5}

# Объединение нескольких множеств
print(a.union(b, c))  # {1, 2, 3, 4, 5}

# Пересечение нескольких
print(a.intersection(b, c))  # {3}

# Разность нескольких (по порядку: a - b - c)
print(a.difference(b, c))    # {1}

6. Использование set для фильтрации данных

Пример
# Уникальные email из списка
emails = ["a@b.ru", "b@c.com", "a@b.ru", "c@d.org"]
unique_emails = set(emails)
print(unique_emails)  # {'b@c.com', 'c@d.org', 'a@b.ru'}

7. Frozenset как элемент множества для вложенности

Пример
# Невозможно сделать set из set, но frozenset можно
nested = {frozenset([1,2]), frozenset([3,4,5])}
print(nested)  # {frozenset({1, 2}), frozenset({3, 4, 5})}
# Проверка вхождения
print(frozenset([1,2]) in nested)  # True

8. Производительность: in vs list

Пример
import time

data = list(range(100000))
set_data = set(data)

start = time.time()
99999 in data   # O(n)
list_time = time.time() - start

start = time.time()
99999 in set_data  # O(1)
set_time = time.time() - start

print(f"Список: {list_time:.6f} сек, Множество: {set_time:.6f} сек")
Список: 0.002512 сек, Множество: 0.000001 сек

9. Преобразование множества в отсортированный список

Пример
s = {10, 5, 20, 1}
sorted_list = sorted(s)
print(sorted_list)  # [1, 5, 10, 20]
# Сортировка в обратном порядке
print(sorted(s, reverse=True))  # [20, 10, 5, 1]

10. Разность с несколькими множествами и модификация

Пример
a = {1, 2, 3, 4, 5}
b = {2, 4}
c = {1, 5}
a.difference_update(b, c)
print(a)  # {3}

Множество (set) в Python - comments

En
Python типы данных set (python)