【问题标题】:Is there a "Lifo" type priority queue in python in case of multiple elements with the same priority?如果多个元素具有相同的优先级,python中是否存在“Lifo”类型的优先级队列?
【发布时间】:2020-12-28 13:52:57
【问题描述】:

我在 python 的优先级队列中有两个具有相同等级的元组。 get 方法将采用插入的第一个元素。 如果两个元素在队列中具有相同的优先级,我想先返回最后插入的元素:

#python 3.7
import queue
q= queue.PriorityQueue()
q.put((1, 'first_in'))
q.put((1, 'last_in'))
q.put((2, 'not_to_be_returned'))

for i in range(q.qsize()):
    print(q.get(i))

#Returns
(1, 'first_in')
(1, 'last_in')
(2, 'not_to_be_returned')

#looking for : 
(1, 'last_in') # in case of same rank return the last inserted
(1, 'first_in') 
(2, 'not_to_be_returned')

#Merci

【问题讨论】:

  • 我刚刚注意到 'first_in` 被首先抓取,因为 first_in 按字母顺序排在第一位。 q= queue.PriorityQueue() q.put((1, 'first_in')) q.put((1, 'last_in') q.put((1, 'abcdf') 返回(1, 'abcdf'), (1, 'first_in'), (1, 'last_in'). .我们可以添加第二个条目吗
  • @tessie,感谢您富有洞察力的通知。确实。

标签: python data-structures priority-queue


【解决方案1】:

如果你真的需要这种排序,最简单的解决方法是在你的元组中添加一个新的第二个元素,当两个元组中的第一个元素相同时,该元素将用于打破平局。

对于 LIFO 排序,您使用每次插入时递减的计数器。然后你的元素变成:

q.put((1, 0, 'first_in'))
q.put((1, -1, 'last_in'))
q.put((2, -2, 'not_to_be_returned'))

【讨论】:

  • 完全正确。 This answer 解释了为什么不能在基于堆的优先级队列中维护插入顺序,除非您维护某种有关到达时间的信息。
【解决方案2】:

是的,那就是queue.LifoQueue。见docs

【讨论】:

  • 谢谢,但 lifo 队列不是优先队列。我想先返回优先级最高的项目,如果两个项目具有相同的优先级,则执行 lifo 选择。
  • @greg 好吧,这不是您在问题中提出的问题。
  • @go2nirvana 题目是:“python中是否存在“Lifo”类型的优先队列?”。
  • 对不起,我是新手,我只是通过添加另一个示例将代码更改为更明确。
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多