Множества (set) в Python — это встроенный тип, предлагающий широкий набор возможностей, которые повторяют теорию множеств из математики. Тем не менее интерпретация может отличаться от той, что принята в математике. Set импортировать не нужно. А в этом материале вы узнаете о нем все, что потребуется для работы.
Что это
Множества — это неупорядоченная коллекция уникальных элементов, сгруппированных под одним именем. Множество может быть неоднородным — включать элементы разных типов. Множество всегда состоит только из уникальных элементов (дубли запрещены) в отличие от списков и кортежей в Python. Объект set — это также коллекция уникальных хэшируемых объектов. Объект называется хэшируемым в том случае, если его значение хэша не меняется. Это используется в ключах словарей и элементах множеств, ведь значения хэшей применяются в их внутренних структурах.
Чаще всего множества в Python используются для проверки на принадлежность, удаления повторов из последовательности и выполнения математических операций, таких как пересечение, объединение, поиск разностей и симметрических разностей. Изображение ниже показывает два примера множеств (алфавит и цифры), каждый из которых включает уникальные неизменяемые объекты.
Создание множеств Python
Создать объект set в Python можно двумя путями:
- Использовать фигурные скобки
{} - Использовать встроенную функцию
set()
Примечание: не используйте зарезервированные ключевые слова и названия встроенных классов в качестве имен для множеств. Это не поощряется в программировании на Python.
Множество создается при размещении всех элементов внутри фигурных скобок {}, как показано на примере ниже.
s1 = {} # Это создаст пустое множество
s2 = {1, 'pythonru', 20.67}
Еще один способ создать (или определить) множество Python — использовать функцию set(). Пример ниже.
s1 = set() # Это создаст пустое множество
s2 = set({1, 'pythonru', 20.67})
Первый способ (с использованием фигурных скобок {}) определенно проще.
Нет ограничений на количество элементов в объекте set, но запрещено добавлять элементы изменяемых типов, такие как список или словарь. Если попробовать добавить список (с набором элементов), интерпретатор выдаст ошибку.
s5 = { 1, 2, 3, [5, 6, 7, 8] }
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
Добавление элементов в множества Python
Объекты set в Python поддерживают добавление элементов двумя путями: по одному с помощью метода add() или группами с помощью update(). Оба описаны дальше.
Добавление одного элемента в множество Python
Один элемент можно добавить с помощью метода add(). Такой код выглядит следующим образом.
set1 = {1, 3, 4}
set1.add(2)
print(set1)
{1, 2, 3, 4}
Добавление нескольких элементов в множество Python
Больше одного элемента можно добавить с помощью update(). Код следующий.
set2 = {1, 2, 3}
set2.update([4, 5, 6])
print(set2) # {1, 2, 3, 4, 5, 6}
Удаление элементов из множеств Python
Один или несколько элементов можно удалить из объекта set с помощью следующих методов. Их отличие в виде возвращаемого значения.
remove()discard()pop()
remove()
Метод remove() полезен в тех случаях, когда нужно удалить из множества конкретный элемент и вернуть ошибку в том случае, если его нет в объекте.
Следующий код показывает метод remove() в действии.
set1 = {1, 2, 3, 4, 'a', 'p'}
set1.remove(2)
print(set1)
{1, 3, 4, 'a', 'p'}
set1.remove(5)
# Error element not found
discard()
Метод discard() полезен, потому что он удаляет конкретный элемент и не возвращает ошибку, если тот не был найден во множестве.
set1 = {1, 3, 4, 'a', 'p'}
set1.discard('a')
print(set1)
# {1, 3, 4 'p'}
set1.discard(6)
print(set1)
# {1, 3, 4, 'p'}
pop()
Метод pop() удаляет по одному элементу за раз в случайном порядке. Set — это неупорядоченная коллекция, поэтому pop() не требует аргументов (индексов в этом случае). Метод pop() можно воспринимать как неконтролируемый способ удаления элементов по одному из множеств в Python.
set1 = {1, 3, 4, “p”}
set1.pop()
3 # случайный элемент будет удален (ваш результат может отличаться)
Методы множеств Python
У объектов set есть несколько встроенных методов. Увидеть их все можно с помощью команды dir(). dir(object) в Python показывает самые важные атрибуты разных типов объектов.
Вот что выдаст функция для объекта set в Python.
set1 = { 1, 2, 3, 4}
dir(set1)
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
Часто используемые функции множеств Python
Из всех методов, перечисленных в dir(), только несколько из них используются постоянно. Вы уже знакомы с add, update, remove, pop и discard.
Вот на какие также стоит обратить внимание.
Функция принадлежности (членства)
Она проверяет на наличие конкретного элемента в множестве.
num_set = {1 ,3, 5, 7, 9, 10}
7 in num_set
# True
2 in num_set
# False
1 not in num_set
# False
Разные функции
len(num_set) — вернет количество элементов в объекте set.
6
copy() — создает копию существующего множества и сохраняет ее в новом объекте.
new_set = num_set.copy()
clear() —очищает множество (удаляет все элементы за раз)
num_set.clear()
del — удаляет множество целиком
del num_set
Дальше речь пойдет об операциях union, issubset, issuperset, difference_update и других.
Операции множеств в Python
В этом разделе вы узнаете о разных операциях над множествами, которые являются частью теории множеств.
Объединение множеств
При использовании на двух множествах вы получаете новый объект, содержащий элементы обоих (без повторов). Операция объединения в Python выполняется двумя способам: с помощью символа | или метода union().
A = {1, 2, 3}
B = {2, 3, 4, 5}
C = A | B # используя символьный метод
C = A.union(B) # используя метод union
print(C)
# {1, 2, 3, 4, 5}
Пересечение множеств
При использовании на двух множествах вы получаете новый объект, содержащий общие элементы обоих (без повторов). Операция пересечения выполняется двумя способами: с помощью символа & или метода intersection().
A = {1, 2, 3, 4}
B = {3,4,5,6}
C = A & B # используя символьный метод
C = A.intersection(B) # используя метод intersection
print(C)
# {3,4}
Разность множеств
При использовании на двух множествах вы получаете новый объект, содержащий элементы, которые есть в первом, но не втором (в данном случае — в множестве “A”). Операция разности выполняется двумя способами: с помощью символа - или метода difference().
A = {1, 2, 3, 4}
B = {3,4,5,6}
C = A - B # используя символьный метод
C = A.difference(B) # используя метод difference
print(C)
# {1,2}
Симметричная разность множеств
При использовании на двух множествах вы получаете новый объект, содержащий все элементы, кроме тех, что есть в обоих. Симметрическая разность выполняется двумя способами: с помощью символа ^ или метода symmetric_difference().
C = A ^ B # используя символьный метод
C = A.symmetric_difference(B) # используя метод symmetric_difference
print(C)
# {1, 2, 5, 6}
Подмножество и надмножество в Python
Множество B (SetB) называется подмножество A (SetA), если все элементы SetB есть в SetA. Проверить на подмножество в Python можно двумя способами: с помощью символа <= или метода issubset(). Он возвращает True или False в зависимости от результата.
A = {1, 2, 3, 4, 5}
B = {2,3,4}
B <= A # используя символьный метод
B.issubset(A) # используя метод issubset
# True
Множество A (SetA) называется надмножество B (SetB), если все элементы SetB есть в SetA. Проверить на надмножество в Python можно двумя способами: с помощью символа >= или метода issuperset(). Он возвращает True или False в зависимости от результата.
A = {1, 2, 3, 4, 5}
B = {2,3,4}
A >= B # используя символьный метод
A.issuperset(B) # используя метод issubset
# True
Бонус
А теперь бонус для тех, кто дочитал до этого места. Многие начинающие программисты задаются вопросом, как удалить повторяющиеся элементы из списка?
Ответ: просто передайте список функции set() и все дубли будут удалены автоматически. Результат потом можно снова передать в функцию list(), чтобы он снова стал списком.
List1 = [1, 2, 3, 5, 3, 2, 4, 7]
List_without_duplicate = set(List1)
print(List_without_duplicate)
# (1, 2, 3, 5, 4, 7) преобразован в множество
back_to_list = list(List_without_duplicate)
# [1, 2, 3, 5, 4, 7] снова преобразован в список
Выводы
Теперь вы знакомы с объектами set в Python и теорией множеств на практике. Знаете как создавать множества, менять их, добавляя или удаляя элементы. Вы также знаете, как использовать метод dir и другие методы для множеств в Python. Наконец, познакомились с операциями union, intersection, difference, symmetric difference, subset и superset.










