【发布时间】:2014-10-08 17:42:51
【问题描述】:
如果我有一个包含以下元素的 heapq:
import heapq
class Element(object):
def __init__(self, name, val):
self.name = name
self.val = val
if __name__ == "__main__":
heap = []
e1 = Element('A', 1)
e2 = Element('B', 65)
e3 = Element('C', 53)
e4 = Element('D', 67)
...
heapq.heappush(heap, e1)
heapq.heappush(heap, e2)
heapq.heappush(heap, e3)
heapq.heappush(heap, e4)
...
#IF I want to take elements from the heap and print them I will call:
while heap:
new_e = heapq.heappop(heap)
print new_e.name + ' ' + str(new_e.val)
假设我在堆上有 50 个元素。我想将元素 e3 的值从 val = 53 更改为 val = 0。所以这不是堆的顶部元素。我也不想从堆中删除其他元素。 我怎样才能进行这样的更新?
【问题讨论】:
-
使用
heapq制作优先级队列的可能解决方案是right there in the documentation。 -
您的
Elements 无法比较,所以我不确定您如何将它们与heapq一起使用。您需要一个__lt__方法(或使用已经具有可比性的内置类型,例如tuple)。 -
哦,我明白了,在 Python 2 中,所有对象都是可比较的,如果您不定义
__cmp__或某些丰富的比较方法,则可以随意排序。不过,这个问题仍然有些荒谬,因为Element实例的val属性与其在堆中的位置完全没有关系。
标签: python python-2.7 queue heap priority-queue