python中具有重复键的优先级队列
Posted
技术标签:
【中文标题】python中具有重复键的优先级队列【英文标题】:Priority queue in python with duplicate keys 【发布时间】:2015-02-10 13:07:19 【问题描述】:我有以下场景 -
In [2]: from heapq import heappush, heappop
In [3]: pq =[]
In [4]: heappush(pq, (2, "I hate sth"))
In [5]: heappush(pq, (2, "I love sth"))
In [6]: heappush(pq, (2, "I gate sth"))
In [7]: heappop(pq)
Out[7]: (2, 'I gate sth')
在这里,我希望堆返回 (2, "I hate sth")
我的意思是如果有任何重复项,那么它应该返回最先插入的最小项。我知道这里的项目是元组,所以第三个显然很小。
但是有什么方法可以分别存储优先级和字符串,如果有平局,则按插入顺序返回项目。
谢谢
【问题讨论】:
一种解决方法可能是创建一个用于添加到堆中的辅助方法,该方法将在元组的第二个位置插入并增加一个计数器。 是的,我正在考虑这样做,但还有其他选择吗,比如 python 是否允许我将优先级队列存储为(键、对象),其中对象不包含在优先级计算中。 或者,不使用元组,而是为队列中的项目创建自己的类,该类将仅使用第一个元素进行比较,或自动处理所述计数器。 【参考方案1】:使用 PriorityQueue 类 - 它按添加顺序返回对象
from queue import PriorityQueue
q=PriorityQueue()
q.put((1,'eat'))
q.put((2,'code1'))
q.put((2,'code2'))
q.put((2,'code3'))
q.put((3,'sleep'))
while(not q.empty()):
print(q.get())
# Output
# (1, 'eat')
# (2, 'code1')
# (2, 'code2')
# (2, 'code3')
# (3, 'sleep')
【讨论】:
这是不正确的。如果 item 中的第一个值重复,它将尝试根据 item 中的后续值进行排序。以上是关于python中具有重复键的优先级队列的主要内容,如果未能解决你的问题,请参考以下文章