为何Python PriorityQueue等待列表无法维护手术的字典序?
Python PriorityQueue 队列顺序异常的原因与解决办法
问题原因
Python标准库的queue.PriorityQueue底层基于小顶堆实现,堆结构的核心特性是:
- 仅保证堆顶元素是当前队列中优先级最高(最小)的元素
- 堆的底层存储列表并非完全有序,兄弟节点之间没有严格的顺序要求
你直接打印waitlist.queue看到的是堆的原始存储结构,不是按优先级排序后的序列,所以会出现部分元素顺序不符合预期的情况,这是堆结构的正常表现,并非PriorityQueue逻辑错误。
解决办法
要获取正确的优先级排序结果,必须使用PriorityQueue提供的get()方法逐个取出元素。每次调用get()都会弹出当前堆顶的最小元素,重复此操作直到队列为空,就能得到完全按优先级排序的序列。
修改你的示例代码中的打印部分:
# 正确获取按优先级排序的元素 while not waitlist.empty(): print(waitlist.get())
执行后输出会符合(p, date)元组的字典序要求:
Surgery((1, Timestamp('2022-01-01 00:00:00', freq='D'))) Surgery((1, Timestamp('2022-01-03 00:00:00', freq='D'))) Surgery((1, Timestamp('2022-01-04 00:00:00', freq='D'))) Surgery((1, Timestamp('2022-01-05 00:00:00', freq='D'))) Surgery((1, Timestamp('2022-01-06 00:00:00', freq='D'))) Surgery((1, Timestamp('2022-01-07 00:00:00', freq='D'))) Surgery((1, Timestamp('2022-01-10 00:00:00', freq='D'))) Surgery((2, Timestamp('2022-01-02 00:00:00', freq='D'))) Surgery((2, Timestamp('2022-01-08 00:00:00', freq='D'))) Surgery((2, Timestamp('2022-01-09 00:00:00', freq='D')))
注意事项
PriorityQueue的queue属性是内部实现细节,官方文档明确不建议直接访问或修改它,所有队列操作都应通过put()、get()、empty()等公共接口完成。
内容的提问来源于stack exchange,提问作者Galen
相关产品推荐
相关产品推荐

