我可以从PriorityQueue获取一个项目而不删除它吗?

Jie*_*eng 25 python queue python-3.x

我想得到队列中的下一个项目,但我不想让它出列.是否可以在Python的优先级队列中使用?从文档中,我看不出它是如何完成的

HYR*_*YRY 30

如果a是PriorityQueue对象,则可以使用a.queue [0]获取下一个项目:

from Queue import PriorityQueue

a = PriorityQueue()

a.put((10, "a"))
a.put((4, "b"))
a.put((3,"c"))

print a.queue
print a.get()
print a.queue
print a.get()
print a.queue
Run Code Online (Sandbox Code Playgroud)

输出是:

[(3, 'c'), (10, 'a'), (4, 'b')]
(3, 'c')
[(4, 'b'), (10, 'a')]
(4, 'b')
[(10, 'a')]
Run Code Online (Sandbox Code Playgroud)

但要注意多线程访问.

  • @Woofas你会发现第二高的优先级是`q.queue [1]`或`q.queue [2]`.这是因为根据优先级队列的理论,父级(在这种情况下为"q.queue [0]")必须具有比其两个子级中更高的优先级(`q.queue [1]`和`q. queue [2]`),但这两个孩子的具体顺序并不重要.这意味着整个q.queue不是绝对排序的,只有"堆"排序(即每个级别的优先级高于它下面的级别) (4认同)
  • 看来,当`q.queue [0]`返回队列中的最高优先级项时,`q.queue [1]`不一定返回第二高优先级项 (3认同)
  • @SobirBobiev 不。队列使用 `a.queue` 作为其存储。列表是队列在内存中简单存储的方式。只要构造了队列,列表就一定在那里。通过直接访问列表,您只需绕过队列的整个逻辑并直接进入其存储。 (3认同)

Vic*_*iet 6

如果要在PriorityQueue中下一个元素,请按照元素插入的顺序使用:

for i in range(len(queue)):
    print queue.queue[i]
Run Code Online (Sandbox Code Playgroud)

这不会弹出任何东西。

如果要按优先级顺序使用,请使用:

for i in range(len(queue)):
    temp = queue.get()
    queue.put(temp)
    print temp
Run Code Online (Sandbox Code Playgroud)

如果您使用的是元组,而不是单个变量,则将temp替换为:

((temp1,temp2))
Run Code Online (Sandbox Code Playgroud)


Nil*_*esh 2

当您根据理论从队列中获取项目时,它将从队列中删除。您必须编写自己的函数,该函数将为您提供 PriorityQueue 的最后一个元素。您可以通过继承priorityqueue来创建peek函数。