Python heappop的异常结果?

Python heappop的异常结果?,python,python-2.7,heap,Python,Python 2.7,Heap,我有一个定义为列表列表的简单堆。我使用heapq模块中的heapop来提取具有最小键的列表,我知道该键隐式地是内部列表的第一个元素。但在接下来的案例中,pop操作似乎产生了不寻常的结果 有人能解释一下原因吗 堆=[[0,0,0],[inf,1,1],[inf,2,2],[5,3,3],[inf,4,4]] heapq.heappopheap [0,0,0] heapq.heappopheap [inf,1,1] heapq.heappopheap [5,3,3] heapq.heappophea

我有一个定义为列表列表的简单堆。我使用heapq模块中的heapop来提取具有最小键的列表,我知道该键隐式地是内部列表的第一个元素。但在接下来的案例中,pop操作似乎产生了不寻常的结果

有人能解释一下原因吗

堆=[[0,0,0],[inf,1,1],[inf,2,2],[5,3,3],[inf,4,4]]

heapq.heappopheap

[0,0,0]

heapq.heappopheap

[inf,1,1]

heapq.heappopheap

[5,3,3]

heapq.heappopheap

[inf,2,2]

heapq.heappopheap


[inf,4,4]

问题是您在非堆的列表上使用了heapq。讨论了如何使用heapify命令,这确实有效:

>>> import heapq
>>> from numpy import inf
>>> heap=[[0, 0, 0], [inf, 1, 1], [inf, 2, 2], [5, 3, 3], [inf, 4, 4]]
>>> heapq.heapify(heap)
>>> heap
[[0, 0, 0], [5, 3, 3], [inf, 2, 2], [inf, 1, 1], [inf, 4, 4]]
>>> heapq.heappop(heap)
[0, 0, 0]
>>> heapq.heappop(heap)
[5, 3, 3]
>>> heapq.heappop(heap)
[inf, 1, 1]
>>> heapq.heappop(heap)
[inf, 2, 2]
>>> heapq.heappop(heap)
[inf, 4, 4]

问题是,您正在非堆的列表上使用heapq。讨论了如何使用heapify命令,这确实有效:

>>> import heapq
>>> from numpy import inf
>>> heap=[[0, 0, 0], [inf, 1, 1], [inf, 2, 2], [5, 3, 3], [inf, 4, 4]]
>>> heapq.heapify(heap)
>>> heap
[[0, 0, 0], [5, 3, 3], [inf, 2, 2], [inf, 1, 1], [inf, 4, 4]]
>>> heapq.heappop(heap)
[0, 0, 0]
>>> heapq.heappop(heap)
[5, 3, 3]
>>> heapq.heappop(heap)
[inf, 1, 1]
>>> heapq.heappop(heap)
[inf, 2, 2]
>>> heapq.heappop(heap)
[inf, 4, 4]

如果在执行某些操作时将inf修改为某个值会怎么样?我需要再次运行heapify吗?如果您可能更改顺序,那么您需要再次运行heapify。这不是魔术——它只是一个标准化的排序算法。一个选项是堆出要更改的列表,然后堆入新列表。如果要将列表作为一堆保存,然后只需使用heapq操作修改它。heapq.HEAPPREPLACE是一个函数,它允许您同时执行pop和push检查-这很好。我正在实现Dijkstra算法,其中表示到源距离的第一个值会随着更好路径的形成而修改。我现在正在使用列表分配uptill更改值。您有更好的建议吗?如果我在执行某些操作时将inf修改为某个值会怎么样?我需要再次运行heapify吗?如果您可能更改顺序,那么您需要再次运行heapify。这不是魔术——它只是一个标准化的排序算法。一个选项是堆出要更改的列表,然后堆入新列表。如果要将列表作为一堆保存,然后只需使用heapq操作修改它。heapq.HEAPPREPLACE是一个函数,它允许您同时执行pop和push检查-这很好。我正在实现Dijkstra算法,其中表示到源距离的第一个值会随着更好路径的形成而修改。我现在正在使用列表分配uptill更改值。你有更好的建议吗?