Тип данных 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) # FalsePython типы данных 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}