Множества в Python: создание, манипуляции и операции
Множества в Python
Узнайте, как тип данных set в Python упрощает дедупликацию данных и операции над множествами. Руководство охватывает создание, изменение, удаление и все основные операции над множествами.
Видео: Множества в Python
Множество (set) — это неупорядоченная коллекция уникальных, неизменяемых элементов. Хотя само множество изменяемо — позволяет добавлять или удалять элементы — его отдельные элементы должны быть хешируемыми (например, числа, строки, кортежи).
Множества Python поддерживают математические операции над множествами: объединение, пересечение, разность и симметрическую разность, что делает их идеальными для задач вроде дедупликации данных, проверки принадлежности и алгебры множеств.
Создание множеств в Python
Используйте фигурные скобки или встроенный конструктор set() для создания множества. Элементы могут быть любого неизменяемого типа, но изменяемые типы (списки, словари, другие множества) включать нельзя.
# Пример 1: Множества с разными типами данных
# множество целых
my_set = {1, 2, 3}
print(my_set)
# множество смешанных типов
my_set = {1.0, 'Hello', (1, 2, 3)}
print(my_set)
Вывод
{1, 2, 3}
{1.0, (1, 2, 3), 'Hello'}
Обратите внимание: дубликаты автоматически удаляются, а кортежи — будучи неизменяемыми — принимаются.
# Удаление дубликатов
my_set = {1, 2, 3, 4, 3, 2}
print(my_set)
# Создание множества из списка
my_set = set([1, 2, 3, 2])
print(my_set)
# Попытка включить изменяемый элемент вызывает ошибку
# my_set = {1, 2, [3, 4]} # TypeError: unhashable type: 'list'
Вывод
{1, 2, 3, 4}
{1, 2, 3}
Traceback (most recent call last):
File "<string>", line 15, in <module>
my_set = {1, 2, [3, 4]}
TypeError: unhashable type: 'list'
Создание пустого множества требует конструктора set(); использование {} создаёт пустой словарь.
# Различие между множеством и словарём при создании пустых структур
a = {}
print(type(a))
a = set()
print(type(a))
Вывод
<class 'dict'> <class 'set'>
Изменение множества в Python
Множества изменяемы, но не поддерживают индексацию или срезы из-за своей неупорядоченной природы.
Используйте add() для добавления одного элемента и update() для объединения с другим итерируемым объектом. Дубликаты автоматически игнорируются.
# Пример: Добавление элементов
my_set = {1, 3}
print(my_set)
# Попытка индексации вызывает ошибку
# my_set[0] # TypeError: 'set' object does not support indexing
# Добавить один элемент
my_set.add(2)
print(my_set)
# Добавить несколько элементов из списка
my_set.update([2, 3, 4])
print(my_set)
# Объединить список и другое множество
my_set.update([4, 5], {1, 6, 8})
print(my_set)
Вывод
{1, 3}
{1, 2, 3}
{1, 2, 3, 4}
{1, 2, 3, 4, 5, 6, 8}
Удаление элементов из множества
Используйте discard() для удаления элемента, если он существует, или ничего не делать иначе. В отличие от этого, remove() вызывает KeyError, если элемента нет.
# Пример: discard vs remove
my_set = {1, 3, 4, 5, 6}
print(my_set)
my_set.discard(4)
print(my_set)
my_set.remove(6)
print(my_set)
my_set.discard(2)
print(my_set)
# Следующее вызовет KeyError
# my_set.remove(2)
Вывод
{1, 3, 4, 5, 6}
{1, 3, 5, 6}
{1, 3, 5}
{1, 3, 5}
Traceback (most recent call last):
File "<string>", line 28, in <module>
KeyError: 2
Метод pop() удаляет и возвращает произвольный элемент, а clear() очищает множество полностью.
# Пример pop и clear
my_set = set("HelloWorld")
print(my_set)
print(my_set.pop())
print(my_set)
my_set.clear()
print(my_set)
Вывод
{'H', 'l', 'r', 'W', 'o', 'd', 'e'}
H
{'r', 'W', 'o', 'd', 'e'}
set()
Операции над множествами в Python
Множества Python поддерживают классическую алгебру множеств: объединение, пересечение, разность и симметрическую разность. Их можно вызывать через операторы или специальные методы.
Используем два примера множеств:
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}
Объединение

Объединение A и B يجمع все уникальные элементы.
print(A | B)
Вывод
{1, 2, 3, 4, 5, 6, 7, 8}
Пересечение

Пересечение возвращает только элементы, общие для обоих множеств.
print(A & B)
Вывод
{4, 5}
Разность

Разность A - B перечисляет элементы, присутствующие в A, но не в B.
print(A - B)
Вывод
{1, 2, 3}
Симметрическая разность

Симметрическая разность A ^ B возвращает элементы, которые есть в одном из множеств, но не в обоих одновременно.
print(A ^ B)
Вывод
{1, 2, 3, 6, 7, 8}
Дополнительные методы множеств
Ниже — краткий справочник всех встроенных методов объектов set:
| Метод | Описание |
|---|---|
| add() | Добавляет элемент во множество |
| clear() | Удаляет все элементы |
| copy() | Возвращает поверхностную копию |
| difference() | Возвращает новое множество элементов, присутствующих в вызывающем, но не в других |
| difference_update() | Удаление разности на месте |
| discard() | Удаляет элемент, если он есть; без ошибки, если нет |
| intersection() | Возвращает новое множество общих элементов |
| intersection_update() | Обновление пересечением на месте |
| isdisjoint() | True, если множества не имеют общих элементов |
| issubset() | True, если вызывающее является подмножеством другого |
| issuperset() | True, если вызывающее полностью содержит другое множество |
| pop() | Удаляет и возвращает произвольный элемент; KeyError если пусто |
| remove() | Удаляет элемент; KeyError если отсутствует |
| symmetric_difference() | Возвращает новое множество элементов, эксклюзивных для каждого |
| symmetric_difference_update() | Обновление симметрической разностью на месте |
| union() | Возвращает новое множество со всеми уникальными элементами |
| update() | Обновление объединением с другим итерируемым на месте |
Проверка принадлежности к множеству
Проверьте наличие элемента с ключевым словом in.
my_set = set("apple")
print('a' in my_set) # True
print('p' not in my_set) # False
Вывод
True False
Итерация по множеству
Перебор множества стандартным циклом for; порядок не гарантирован.
for letter in set("apple"):
print(letter)
Встроенные функции с множествами
Функции вроде len(), max(), min(), sum(), all(), any(), sorted() отлично работают с множествами. Таблица распространённых утилит:
| Функция | Описание |
|---|---|
| all() | True, если все элементы истинны (или множество пусто) |
| any() | True, если хотя бы один элемент истинен |
| enumerate() | Итерирует с индексом, полезно для отладки |
| len() | Количество элементов |
| max() | Наибольший элемент |
| min() | Наименьший элемент |
| sorted() | Возвращает отсортированный список из множества |
| sum() | Сумма всех числовых элементов |
Frozenset в Python
frozenset — это неизменяемый аналог множества. После создания его элементы нельзя изменить, что делает его хешируемым и пригодным для использования как ключ словаря.
A = frozenset([1, 2, 3, 4])
B = frozenset([3, 4, 5, 6])
Поддерживаемые операции зеркалят обычные множества, за исключением мутирующих методов.
print(A.isdisjoint(B))
print(A.difference(B))
print(A | B)
# Попытка добавить элемент вызовет AttributeError
# A.add(3) # AttributeError: 'frozenset' object has no attribute 'add'
Python
- Освоение типов данных в Python: практическое руководство
- Мастерство операторов Python: Полное руководство
- Оператор pass в Python: практическое руководство
- Аргументы функций в Python: позиционные, именованные и параметры по умолчанию
- Словари в Python: создание, манипуляции и продвинутые техники
- Итераторы в Python: как они работают и как создать свои
- Замыкания в Python: как вложенные функции захватывают переменные
- Модуль datetime в Python: практическое руководство по датам, времени и часовым поясам
- Обзор Python: высокоуровневый, читаемый, интерактивный и объектно-ориентированный язык
- Числа в Python: Неизменяемые числовые типы данных