Множества в Python — это особый тип коллекции, который хранит уникальные неповторяющиеся элементы без определённого порядка. Множества очень полезны, когда нужно избавиться от дубликатов или быстро проверить, есть ли определённый элемент в наборе, потому что поиск в множествах работает быстрее.
Вот несколько особенностей множеств:
Множество — это как мешок с разными объектами, но в нем не может быть одинаковых предметов.
Элементы множества не упорядочены -то есть у них нет индексов, к которым можно обратиться.
Множество можно изменять — добавлять и удалять элементы.
Множество не может содержать изменяемых объектов, например, списки, но может содержать неизменяемые: числа, строки.
Создать новое множество можно через фигурные скобки с перечислением элементов:
fruits = {"яблоко", "банан", "киви"}
print(fruits) # Порядок может быть любым, например {'киви', 'яблоко', 'банан'}
Здесь мы создаем множество fruits, сразу перечисляя внутри фигурных скобок несколько строк — названия фруктов. Обратите внимание, что порядок элементов может отличаться — множества в Python не упорядочены, поэтому элементы выводятся в произвольном порядке. Главное — в множестве не будет повторов.
Можно создать и пустое множество:
empty_set = set()
print(empty_set) # set()
Пустое множество можно воспринимать как пустую коробочку, в которую мы в будущем сложим какие-то нужные нам объекты.
Основные операции с множествами
Естественно, есть большое количество операций, которые можно реализовать с множествами. Давайте рассмотрим некоторые из них.
Например, можно проверить, есть ли элемент в множество с помощью in:
print("яблоко" in fruits) # True
print("груша" in fruits) # False
Оператор in проверяет, есть ли элемент множества. В данном случае «яблоко» в fruits есть, а «груша» — нет.
Также мы можем добавить новый элемент в множество:
Метод .add() добавляет новый элемент в множество. Если элемент уже есть, множество не изменится.
Для простого удаления элементов из множества у нас есть целых два метода:
fruits.remove("банан")
fruits.discard("апельсин") # нет ошибки, хоть элемента и нет
print(fruits) # Например: {'яблоко', 'киви', 'груша'}
Метод .remove () удалит элемент, но если его нет в множестве — будет ошибка. А вот .discard () также удаляет элемент, но если элемент не найден — ошибки не будет. Так можно безопасно удалить элемент, не беспокоясь о том, что программа перестанет работать.
Еще можно не просто удалять элемент, но и возвращать его:
item = fruits.pop()
print(item) # Например: 'киви'
print(fruits) # Множество без этого элемента
Метод .pop () удаляет и возвращает любой элемент множества — порядок непредсказуемый, это не обязательно первый добавленный элемент. Это полезно, когда нужно взять какой-то элемент без указания конкретного.
Конечно, из множества можно в целом удалить все элементы:
fruits.clear()
print(fruits) # set()
Метод .clear () удаляет все элементы множества, делая его пустым.
Математические операции над множествами
Множества поддерживают операции, которые похожи на операции с обычными множествами в математике (объединение, пересечение и др.). Это удобно для фильтрации, сравнения и объединения данных.
Объединение — это множество, которое содержит все элементы из двух множеств, без повторов.
a = {1, 2, 3}
b = {3, 4, 5}
print(a | b) # {1, 2, 3, 4, 5}
print(a.union(b)) # {1, 2, 3, 4, 5}
Оператор | и метод .union () делают одно и то же — объединяют множества.
Пересечение — это элементы, которые есть в обоих множествах.
print(a & b) # {3}
print(a.intersection(b)) # {3}
& и .intersection () позволяют получить общие элементы двух множеств.
Разность — это элементы из первого множества, которых нет во втором.
print(a - b) # {1, 2}
print(a.difference(b)) # {1, 2}
- и .difference () показывают, что есть в первом, но отсутствует во втором.
С помощью симметрической разности можно найти элементы, которые есть либо в первом, либо во втором множестве, но не в обоих одновременно (то есть исключая пересечение).
^ и .symmetric_difference () возвращают разницу без общих элементов.
Множества можно сравнивать по их элементам.
a <= b — множество a является подмножеством b, то есть все элементы a есть в b
a >= b — множество a является надмножеством b, содержит все элементы b
a == b — множества равны, содержат одни и те же элементы
a = {1, 2}
b = {1, 2, 3, 4}
print(a <= b) # True, т.к. все элементы a есть в b
print(b >= a) # True, т.к. b содержит все элементы a
print(a == b) # False, множества разные по содержимому
Для чего могут быть полезны множества? Например, для удаления повторов:
Здесь мы преобразуем список чисел в множество, тем самым избавляемся от повторов.
Или мы можем найти людей, которые сразу находятся в двух группах, например, клиенты компании, которые сразу участвуют в двух акциях:
# Проверяем пересечение двух групп
group_a = {"Кирилл", "Оля", "Игорь"}
group_b = {"Оля", "Сергей", "Игорь"}
common = group_a & group_b
print("Общие участники:", common) # {'Оля', 'Игорь'}
Таким образом, множества в Python — это удобный и мощный инструмент для работы с уникальными элементами и для реализации основных операций теории множеств.