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中具有重复键的优先级队列的主要内容,如果未能解决你的问题,请参考以下文章

修改队列内容后如何从优先级队列中获取最小元素[重复]

Python heapq 优先队列 Maxheap

具有动态项目优先级的优先级队列

优先级队列(Priority Queue)

优先级队列的总结

倒序优先队列[重复]