Классы множеств Python
Функции множеств, представленные в предыдущем разделе, могут оперировать различными объектами, но они не столь дружественны, как подлинные объекты. Помимо всего прочего сценариям может потребоваться вручную следить за последовательностями, передаваемыми в эти функции. Классы могут действовать успешнее: класс, представленный в примере 18.10, реализует объект множества, который может содержать объекты любого типа. Подобно классам стеков они в сущности являются оболочками вокруг списков Python с дополнительными операциями множеств.
Пример 18.10. PP4E\Dstruct\Basic\set.py
настраиваемый класс множества, допускающий возможность создания нескольких экземпляров
# отфильтровать дубликаты
def __len__(self): return len(self.data)
def __getitem__(self, key): return self.data[key] def __and__(self, other): return self.intersect(other) def __or__(self, other): return self.union(other)
def __repr__(self): return ‘<Set:’ + repr(self.data) + ‘>’
Класс Set используется так же, как класс Stack, рассмотренный выше в этой главе: мы создаем экземпляры и применяем к ним операторы последовательностей плюс особые операции множеств. Пересечение и объединение можно вызывать как методы или с помощью операторов & и |, обычно используемых со встроенными целочисленными объектами. Поскольку теперь в выражениях можно записывать операторы в строку (например, x & y & z), очевидно, нет нужды поддерживать здесь несколько операндов в методах intersect/union (хотя эта модель создает внутри выражения временные объекты, что может привести к потере производительности). Как и для всех объектов, можно использовать класс Set внутри программы или тестировать его интерактивно, как показано ниже:
> >> from set import Set
> >> users1 = Set([‘Bob’, ‘Emily’, ‘Howard’, ‘Peeper’])
> >> users2 = Set([‘Jerry’, ‘Howard’, ‘Carol’])
> >> users3 = Set([‘Emily’, ‘Carol’])
> >> users1 & users2
<Set:[‘Howard’]>
> >> users1 | users2
<Set:[‘Bob’, ‘Emily’, ‘Howard’, ‘Peeper’, ‘Jerry’, ‘Carol’]>
> >> users1 | users2 & users3
<Set:[‘Bob’, ‘Emily’, ‘Howard’, ‘Peeper’, ‘Carol’]>
> >> (users1 | users2) & users3
<Set:[‘Emily’, ‘Carol’]>
> >> users1.data
[‘Bob’, ‘Emily’, ‘Howard’, ‘Peeper’]
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011