| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 | import collectionsclass OrderedSet(collections.MutableSet):    def __init__(self, iterable=None):        self.end = end = []        end += [None, end, end]         # sentinel node for doubly linked list        self.map = {}                   # key --> [key, prev, next]        if iterable is not None:            self |= iterable    def __len__(self):        return len(self.map)    def __contains__(self, key):        return key in self.map    def add(self, key):        if key not in self.map:            end = self.end            curr = end[1]            curr[2] = end[1] = self.map[key] = [key, curr, end]    def discard(self, key):        if key in self.map:            key, prev, next = self.map.pop(key)            prev[2] = next            next[1] = prev    def __iter__(self):        end = self.end        curr = end[2]        while curr is not end:            yield curr[0]            curr = curr[2]    def __reversed__(self):        end = self.end        curr = end[1]        while curr is not end:            yield curr[0]            curr = curr[1]    def pop(self, last=True):        if not self:            raise KeyError('set is empty')        key = self.end[1][0] if last else self.end[2][0]        self.discard(key)        return key    def __repr__(self):        if not self:            return '%s()' % (self.__class__.__name__,)        return '%s(%r)' % (self.__class__.__name__, list(self))    def __eq__(self, other):        if isinstance(other, OrderedSet):            return len(self) == len(other) and list(self) == list(other)        return set(self) == set(other)if __name__ == '__main__':    s = OrderedSet('abracadaba')    t = OrderedSet('simsalabim')    print(s | t)    print(s & t)    print(s - t)
 |