<p>您可以使用<code>heapq</code>从字符串构造maxheap来构建一个类似字符串的对象的minheap,这些对象的字符内容与原始字符串相同,但其比较运算符(以及它们的排序顺序)产生的结果与普通字符串对象相反。如果我们称这个对象为<code>contra_string</code>,那么它的定义如下:</p>
<pre><code>class contra_string(str):
def __init__(self, s):
self.original = s
def __lt__(self, s):
return self.original.__gt__(s)
def __le__(self, s):
return self.original.__ge__(s)
def __eq__(self, s):
return self.original.__eq__(s)
def __ne__(self, s):
return self.original.__ne__(s)
def __gt__(self, s):
return self.original.__lt__(s)
def __ge__(self, s):
return self.original.__le__(s)
def normal(self):
return self.original
</code></pre>
<p>它的用法如下:</p>
<pre><code>import heapq
mystrings = [ 'b', 'c', 'a', 'bravo', 'alpha', 'charlie' ]
maxheap = [contra_string(s) for s in mystrings]
heapq.heapify(maxheap)
print [heapq.heappop(maxheap) for n in range(len(maxheap))]
# prints "['charlie', 'c', 'bravo', 'b', 'alpha', 'a']"
</code></pre>
<p>请记住,堆中的对象是<code>contra_string</code>的实例,因此如果在从堆中弹出对象之后在比较中使用它们,它们的行为会很奇怪。如果在提取对象之后需要对这些对象执行任何涉及自然有序字符串比较的操作,那么可以使用<code>contra_string</code>上的<code>normal</code>方法恢复原始的普通字符串,当然,使用这些原始字符串的比较将正常进行。这看起来像:</p>
<pre><code>original_strings_in_reverse_order = [heapq.heappop(maxheap).normal() for n in range(len(maxheap))]
print type(original_strings_in_reverse_order[0])
# prints "<type 'str'>"
</code></pre>