首页 > 解决方案 > Python3 中的 Heapq 不能使用元组,因为它没有按期望顺序弹出

问题描述

每个人都说如果你将元组推入heapq,它将把第一个参数作为比较因素。

但事实并非如此!我很好奇我的代码有什么问题?

for task_name, counter in tasks_counter.items():
    heappush(tasks_q, (-int(counter), task_name, counter))
heapify(tasks_q)
while tasks_q:
    print(tasks_q.pop())

输出

(-1, 'G', 1)
(-1, 'F', 1)
(-1, 'E', 1)
(-1, 'D', 1)
(-1, 'C', 1)
(-1, 'B', 1)
(-6, 'A', 6)

我想我应该先拿到有价值的物品A,对吧?但事实并非如此。

在 Python 中使用内置优先级队列的任何替代解决方案?

另一个例子的输出。

在此处输入图像描述

标签: pythonheapq

解决方案


您正在使用 的pop功能list。您需要改用heapq.heappop函数。它将调整列表以在此过程中保持堆不变。请参阅基本示例

heapify如果您开始[]heappush重复 调用,也没有必要调用。heappush已经确保保持堆不变式。


推荐阅读