Does Python have an ordered set?

前端 未结 14 1570
予麋鹿
予麋鹿 2020-11-21 13:20

Python has an ordered dictionary. What about an ordered set?

14条回答
  •  清歌不尽
    2020-11-21 13:39

    An ordered set is functionally a special case of an ordered dictionary.

    The keys of a dictionary are unique. Thus, if one disregards the values in an ordered dictionary (e.g. by assigning them None), then one has essentially an ordered set.

    As of Python 3.1 and 2.7 there is collections.OrderedDict. The following is an example implementation of an OrderedSet. (Note that only few methods need to be defined or overridden: collections.OrderedDict and collections.MutableSet do the heavy lifting.)

    import collections
    
    class OrderedSet(collections.OrderedDict, collections.MutableSet):
    
        def update(self, *args, **kwargs):
            if kwargs:
                raise TypeError("update() takes no keyword arguments")
    
            for s in args:
                for e in s:
                     self.add(e)
    
        def add(self, elem):
            self[elem] = None
    
        def discard(self, elem):
            self.pop(elem, None)
    
        def __le__(self, other):
            return all(e in other for e in self)
    
        def __lt__(self, other):
            return self <= other and self != other
    
        def __ge__(self, other):
            return all(e in self for e in other)
    
        def __gt__(self, other):
            return self >= other and self != other
    
        def __repr__(self):
            return 'OrderedSet([%s])' % (', '.join(map(repr, self.keys())))
    
        def __str__(self):
            return '{%s}' % (', '.join(map(repr, self.keys())))
        
        difference = __sub__ 
        difference_update = __isub__
        intersection = __and__
        intersection_update = __iand__
        issubset = __le__
        issuperset = __ge__
        symmetric_difference = __xor__
        symmetric_difference_update = __ixor__
        union = __or__
    

提交回复
热议问题