Множество — это неупорядоченная коллекция различных хешируемых объектов. Как правило, наборы используются для проверки наличия элемента, удаления дубликатов из последовательности и вычисления математических операций, таких как пересечение, объединение, разность и т. д.
Множества, как и другие коллекции, поддерживают операции x in set
, len(set)
и for x in set
. Являясь неупорядоченной коллекцией, множества не записывают положение элемента и порядок вставки.
Поэтому, они не поддерживают индексирование, нарезку или другие действия, подобные порядку сортировки.
Существует два типа встроенных множеств: set()
и frozenset()
- Тип множества
set()
— это изменяемый набор, содержимое которого можно изменить с помощью таких методов, какset.add()
иset.remove()
, и он также поддерживает операции с замороженными наборами. Поскольку тип набора является изменяемым, он не имеет хеш-значения и не может использоваться в качестве ключа словаря или элемента другого набора. - Тип множества
frozenset()
- является неизменяемым и хешируемым, его содержимое нельзя изменить после создания, поэтому его можно использовать как ключ словаря или как элемент другого набора.
Свойства множеств set и frozenset:
- Множества не поддерживают сортировку.
- Множества не поддерживают индексацию элементов.
- Смешивание типов
set
сfrozenset
с помощью двоичных операций возвращают тип первого операнда. Если:frozenset('ab') | set('bc')
, то типfrozenset
. - Оба типа
set
иfrozenset
поддерживают операции сравнения. Типset
сравниваются с типомfrozenset
на основе их членов.
Создание set и frozenset:
- С помощью класса
set()
можно создавать как пустые изменяемые множества, так и преобразовывать последовательности хеш-объектов в изменяемые множества. - Вы можете использовать функцию
frozenset()
как для создания пустых неизменяемых наборов, так и для преобразования последовательности хеш-объектов в неизменяемые наборы. - При преобразовании с помощью классов
set()
иfrozenset()
удаляются повторяющиеся элементы последовательности. - Непустые (незамороженные) наборы также можно создать, поместив последовательность, разделенную запятыми, в фигурных скобках, например:
names = {'Vladislav', 'Julia', 'Natali'}
Примеры использования set(), frozenset()
# Пустое изменяемое множество
empty_set = set()
print(empty_set)
# Пустое неизменяемое множество
empty_fset = frozenset()
print(empty_fset)
# Изменяемое множество
num_set = {'А', 'Б', 'В', 'Г', 'Д'}
print(num_set)
# Добавление элемента к изменяемому множеству
num_set.add(10)
print(num_set)
# Удаление элемента из изменяемого множества
num_set.remove('Д')
print(num_set)
# Метод `.pop()` извлекает и удаляет случайный элемент
num_set.pop()
print(num_set)
# Неизменяемое множество
num_list = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
num_fs = frozenset(num_list)
print(num_list)
# Попробуем удалить из неизменяемого множества элемент
num_fs.remove(1)
Результаты выполнения:
set()
frozenset()
{'А', 'В', 'Б', 'Г', 'Д'}
{'А', 'В', 'Б', 'Г', 10, 'Д'}
{'А', 'В', 'Б', 'Г', 10}
{'В', 'Б', 'Г', 10}
frozenset({0, 1, 2, 3, 4})
Traceback (most recent call last):
File "C:\Users\Razilator\Desktop\Courses\nth-coding\articles\set\main.py", line 31, in <module>
num_fs.remove(1)
AttributeError: 'frozenset' object has no attribute 'remove'
Функции доступные для frozenset()
len()
- возвращает количество элементов.x in fs
- возвращаетсяTrue
, если x присутствует вfs
, иначе -False
.x not in fs
- возвращаетсяTrue
, если x не присутствует вfs
, иначе возвращаетFalse
.isdisjoint(fs)
- возвращаетTrue
, если уfrozenset()
нет общих элементов с другими. Два множества не пересекаются тогда и только тогда, когда их пересечение – пустое множество.issubset(fs)
- возвращаетTrue
, если каждый элемент набора присутствует в другом наборе, иначе возвращаетFalse
.Issueperset(fs)
- возвращаетTrue
, если в наборе присутствуют все элементыfs
, иначе возвращаетFalse
.union(*fs)
- возвращает новый объект с элементами изfrozenset()
и других множеств.intersection(*fs)
- возвращает новый набор с элементами из этого набора и всех других наборов.difference(*fs)
- возвращает новое множествоfrozenset()
с элементами в нем, которых нет в других наборах.symric_difference(fs)
- возвращает новую блок-схему с элементами в одном или другом блоке, но не в обоих.
Примеры использования функций c frozenset()
:
fs = frozenset([1, 2, 3, 4, 5])
size = len(fs)
print('frozenset size =', size)
contains_item = 5 in fs
print('fs contains 5 =', contains_item)
not_contains_item = 6 not in fs
print('fs not contains 6 =', not_contains_item)
is_disjoint = fs.isdisjoint(frozenset([1, 2]))
print(is_disjoint)
is_disjoint = fs.isdisjoint(frozenset([10, 20]))
print(is_disjoint)
is_subset = fs.issubset(set([1, 2]))
print(is_subset)
is_subset = fs.issubset(set([1, 2, 3, 4, 5, 6, 7]))
print(is_subset)
is_superset = fs.issuperset(frozenset([1, 2]))
print(is_superset)
is_superset = fs.issuperset(frozenset([1, 2, 10]))
print(is_superset)
fs1 = fs.union(frozenset([1, 2, 10]), set([99, 98]))
print(fs1)
fs1 = fs.intersection(set((1, 2, 10, 20)))
print(fs1)
fs1 = fs.difference(frozenset([1, 2, 3]))
print(fs1)
fs1 = fs.symmetric_difference(frozenset([1, 2, 10, 20]))
print(fs1)
fs1 = fs.copy()
print(fs1)
Результат:
frozenset size = 5
fs contains 5 = True
fs not contains 6 = True
False
True
False
True
True
False
frozenset({1, 2, 3, 4, 5, 98, 99, 10})
frozenset({1, 2})
frozenset({4, 5})
frozenset({3, 20, 4, 5, 10})
frozenset({1, 2, 3, 4, 5})
Также по теме, вы можете ознакомиться со следующими статьями: