5 .4 . Множества и мультимножества
181
Вам нужно добавить в объект поведение (методы): вам следует на-
писать собственный класс с нуля либо путем расширения
collections.
namedtuple
или
typing.NamedTuple
.
Вам нужно плотно упаковать данные, чтобы сериализовать их для
запи си на жесткий диск или отправить их по Сети: самое время навести
справки по поводу
struct.Struct
, потому что этот объект представляет
собой превосходный вариант использования.
Если вы ищете безопасный вариант, который можно использовать по
умолчанию, то моя общая рекомендация в отношении реализации про-
стой записи, структуры или объекта данных в Python будет следующей:
использовать
collections.namedtuple
в Python 2.
x и его младшего брата,
typing.NamedTuple
, в Python 3.
5 .4 . Множества и мультимножества
В этом разделе вы увидите, как в Python реализуются такие структуры
данных, как изменяемое и неизменяемое множество и мультимножество
(или тип
bag
, то есть мешок), с использованием встроенных типов данных
и классов стандартной библиотеки. Однако сначала давайте составим
краткое
резюме по поводу того, что такое множество.
Множество представляет собой неупорядоченную коллекцию объектов,
которая не допускает повторяющихся элементов. Как правило, множе-
ства используются для быстрой проверки принадлежности значения
множеству, вставки новых значений в множество, удаления значений из
множества и вычисления на множествах операций, таких как объединение
или пересечение двух множеств.
Предполагается, что в «надлежащей» реализации множества операции
проверки на принадлежность будут выполняться за быстрое
O(1) время.
Операции объединения, пересечения, разности и взятия подмножеств
должны в среднем занимать
O(
n) времени. В реализациях множества,
включенных в стандартную библиотеку Python, данные характеристики
производительности соблюдаются
1
.
1
См.
https://wiki .python .org/moin/TimeComplexity
182 Глава 5 • Общие
структуры данных Python
Точно так же, как и словари, множества в Python обрабатываются особым
образом и имеют свой синтаксический сахар, упрощающий их создание.
Например, синтаксис выражения с фигурными скобками для множеств
и конструкция включения в множество позволяют удобно определять
новые экземпляры множеств:
vowels = {'a', 'e', 'i', 'o', 'u'}
squares = {x * x for x in range(10)}
Тем не менее следует быть осторожными: для того чтобы создать пу-
стое множество, вам нужно вызвать конструктор
set()
. Использование
фигурных скобок
{}
неоднозначно и вместо этого создаст пустой сло-
варь.
Python и его стандартная библиотека предоставляют несколько реализа-
ций множества. Давайте их рассмотрим.
set — ваше дежурное множество
Это встроенная в Python реализация множества
1
. Тип
set
изменяемый
и допускает динамическую вставку и удаление элементов.
Множества Python
set
подкрепляются типом данных
dict
и обладают
одинаковыми характеристиками производительности. Любой хешируе-
мый объект
может храниться в множестве
set
2
.
>>> vowels = {'а', 'о', 'э', 'и', 'у', 'ы', 'е', 'е', 'ю', 'я'}
>>> 'э' in
vowels
True
>>> letters = set('алиса')
>>> letters.intersection(vowels)
{'а', 'и'}
>>> vowels.add('х')
1
См. документацию Python «set»:
https://docs .python .org/3/tutorial/datastructures .html#sets
2
См. документацию Python «hashable»:
https://docs .python .org/3/glossary .html
5 .4 . Множества и мультимножества
183
>>> vowels
{'х', 'о', 'э', 'у', 'и', 'ы', 'е', 'е', 'ю', 'а', 'я'}
>>> len(vowels)
6
frozenset — неизменяемые множества
Класс
frozenset
реализует
неизменяемую версию множества
set
. Такое
множество не может быть изменено после того, как оно было сконстру-
ировано
1
. Множества
frozenset
статичны и допускают только операции
с запросами в отношении своих элементов (никаких вставок или удале-
ний). Поскольку множества
frozenset
статичны и хешируемы, они могут
использоваться в качестве ключей словаря или в качестве элементов
другого множества, а это то, что невозможно с обычными (изменяемыми)
объектами-множествами
set
.
>>> vowels = frozenset({'а', 'о', 'э', 'и', 'у', 'ы', 'е', 'е', 'ю',
'я'}) >>> vowels.add('р')
Do'stlaringiz bilan baham: