我希望使用Python的
于是我写了:
heapq
模块。不过,我需要跟踪每个值被设置为哪个索引。于是我写了:
class heap(list):
def __init__(self,xs):
super(heap,self).__init__(xs)
self._index_table = {x:i for i,x in enumerate(self)}
def __setitem__(self,i,v):
print(i,v)
super(heap,self).__setitem__(i,v)
self._index_table[v] = i
def append(self,x):
super(heap,self).append(x)
self._index_table[x] = len(self)-1
from heapq import heapify, heappush, heappop, _siftdown, _siftup
h = heap([4,3,2,1])
heapify(h)
heappush(h,12)
print(h)
print(h._index_table)
并且这将打印
[1, 3, 2, 4, 12]
{1: 3, 2: 2, 3: 1, 4: 0}
heapify
和 heappush
修改了列表中的条目,从而规避了我的所有尝试捕获所有赋值操作。
为什么会发生这种情况?有没有办法解决这个问题?是否仍然可以使用 heapq
模块并仍然跟踪每个值对应的索引?
编辑:
看起来我的代码有一行 heapify(h)
,这是我在原始帖子中没有的。已经修复了这个问题。
heapify
和heappush
调用了修改列表的方法,而你没有重载它们。你尝试过查找heapq
模块的源代码,看看它调用了哪些列表方法吗? - Sam Mussmann