【问题标题】:Priority queue in python with duplicate keyspython中具有重复键的优先级队列
【发布时间】: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 是否允许我将优先级队列存储为(键、对象),其中对象不包含在优先级计算中。
  • 或者,不使用元组,而是为队列中的项目创建自己的类,该类将仅使用第一个元素进行比较,或自动处理所述计数器。

标签: python priority-queue


【解决方案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 中的后续值进行排序。
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
相关资源
最近更新 更多