Самый простой способ - воспользоваться существующими компонентами в стандартной библиотеке.
OrderedDict и MutableSet ABC сделать егоЛегко написать OrderedSet.
Аналогично, вы можете повторно использовать существующий слабый_файл.WeakSet и заменить его базовый set () на OrderedSet.
Индексирование труднее достичь - это самый простой способ преобразовать его в список при необходимости.Это необходимо, потому что наборы и дикты по сути своей редки.
import collections.abc
import weakref
class OrderedSet(collections.abc.MutableSet):
def __init__(self, values=()):
self._od = collections.OrderedDict().fromkeys(values)
def __len__(self):
return len(self._od)
def __iter__(self):
return iter(self._od)
def __contains__(self, value):
return value in self._od
def add(self, value):
self._od[value] = None
def discard(self, value):
self._od.pop(value, None)
class OrderedWeakrefSet(weakref.WeakSet):
def __init__(self, values=()):
super(OrderedWeakrefSet, self).__init__()
self.data = OrderedSet()
for elem in values:
self.add(elem)
Используйте его так:
>>> names = OrderedSet(['Alice', 'Bob', 'Carol', 'Bob', 'Dave', 'Edna'])
>>> len(names)
5
>>> 'Bob' in names
True
>>> s = list(names)
>>> s[2]
'Carol'
>>> s[4]
'Edna'
Обратите внимание, что в Python 3.7 гарантированно заказываются обычные дикты, поэтому выможет заменить dict
на OrderedDict
в этом рецепте, и все будет работать нормально: -)