Множества set() и frozenset() в Python
avatar
7 | (offline)
❤️‍🔥Notehunter Developer
Добавлено:
Категория: Основы «Python»
Комментариев: 0

Множество — это неупорядоченная коллекция различных хешируемых объектов. Как правило, наборы используются для проверки наличия элемента, удаления дубликатов из последовательности и вычисления математических операций, таких как пересечение, объединение, разность и т. д.

Множества, как и другие коллекции, поддерживают операции 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})

Также по теме, вы можете ознакомиться со следующими статьями:

Комментарии к статье 0
Комментариев нет
Форма добавления комментария (необходима регистрация)