<p>这里可能最好使用某种形式的树(在允许O(logn)替换的同时保持排序顺序)。或者,您可以:</p>
<ol>
<li><p>使用二进制搜索查找节点。bisect模块将执行此操作,但它基于普通python比较顺序进行比较,而您似乎是根据每个元组的第二个元素进行排序的。您可以将其颠倒过来,或者编写自己的二进制搜索(或者简单地从左二等分取代码并进行修改)</p></li>
<li><p>同时使用dict<strong>和</strong>列表。该列表只包含排序的<strong>键</strong>。您可以很容易地包装dict类,以确保它保持同步。这允许您在保持键的排序顺序的同时快速更新dict。这可以防止由于dict/list之间的不断转换而导致排序性能下降的问题。</p></li>
</ol>
<p>下面是这样一件事的快速实现:</p>
<pre><code>import bisect
class SortedDict(dict):
"""Dictionary which is iterable in sorted order.
O(n) sorted iteration
O(1) lookup
O(log n) replacement ( but O(n) insertion or new items)
"""
def __init__(self, *args, **kwargs):
dict.__init__(self, *args, **kwargs)
self._keys = sorted(dict.iterkeys(self))
def __setitem__(self, key, val):
if key not in self:
# New key - need to add to list of keys.
pos = bisect.bisect_left(self._keys, key)
self._keys.insert(pos, key)
dict.__setitem__(self, key, val)
def __delitem__(self, key):
if key in self:
pos = bisect.bisect_left(self._keys, key)
del self._keys[pos]
dict.__delitem__(self, key)
def __iter__(self):
for k in self._keys: yield k
iterkeys = __iter__
def iteritems(self):
for k in self._keys: yield (k, self[k])
def itervalues(self):
for k in self._keys: yield self[k]
def update(self, other):
dict.update(self, other)
self._keys = sorted(dict.iterkeys(self)) # Rebuild (faster if lots of changes made - may be slower if only minor changes to large dict)
def keys(self): return list(self.iterkeys())
def values(self): return list(self.itervalues())
def items(self): return list(self.iteritems())
def __repr__(self):
return "%s(%s)" % (self.__class__.__name__, ', '.join("%s=%r" % (k, self[k]) for k in self))
</code></pre>