<h2>有序集在功能上是有序字典的特例</h2>
<p>字典的键是唯一的。因此,如果忽略有序字典中的值(例如,通过给它们赋值<code>None</code>),那么本质上就是一个有序集。</p>
<p><a href="http://docs.python.org/3.1/whatsnew/3.1.html" rel="noreferrer">As of Python 3.1</a>有<a href="http://docs.python.org/dev/py3k/library/collections.html#collections.OrderedDict" rel="noreferrer">^{<cd2>}</a>。下面是OrderedSet的示例实现。(注意,只需要定义或重写很少的方法:<code>collections.OrderedDict</code>和<a href="http://docs.python.org/3.1/library/collections.html#abcs-abstract-base-classes" rel="noreferrer">^{<cd4>}</a>来完成繁重的工作。)</p>
<pre><code>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 = property(lambda self: self.__sub__)
difference_update = property(lambda self: self.__isub__)
intersection = property(lambda self: self.__and__)
intersection_update = property(lambda self: self.__iand__)
issubset = property(lambda self: self.__le__)
issuperset = property(lambda self: self.__ge__)
symmetric_difference = property(lambda self: self.__xor__)
symmetric_difference_update = property(lambda self: self.__ixor__)
union = property(lambda self: self.__or__)
</code></pre>