Michael Spencer <[EMAIL PROTECTED]> wrote:
Nice. When you replace None by an object(), you have no restriction on the elements any more:
Thanks for the suggestion, Marc.
Note that if there is no need to access the middle of the collection, then the implementation is simpler, and less resource-intensive, since the items can be singly-linked
class UniqueQueue(object): def __init__(self, iterable): self._data = _data = {} self._last = self._root = object() # An object the user is unlikely to # reference - thanks Marc self.update(iterable)
def push(self, obj): if not obj in self._data: self._data[self._last] = obj self._last = obj
def pop(self): data = self._data first = data.pop(self._root) self._root = first return first
def update(self, iterable): last = self._last data = self._data for item in iterable: if item not in data: data[last] = item last = item self._last = last
def __iter__(self): data = self._data next = self._root try: while 1: next = data[next] yield next except KeyError: raise StopIteration
def __repr__(self): return "%s(%s)" % (self.__class__.__name__,list(self))
>>> q = UniqueQueue(range(5)) >>> q.update(range(3,8)) >>> q UniqueQueue([0, 1, 2, 3, 4, 5, 6, 7]) >>> q.pop() 0 >>> q UniqueQueue([1, 2, 3, 4, 5, 6, 7]) >>> >>> q.push(None) >>> q UniqueQueue([1, 2, 3, 4, 5, 6, 7, None]) >>>
Michael
-- http://mail.python.org/mailman/listinfo/python-list