2015-04-18 60 views
0

意外行为我有一个PriorityQueue,它的行为似乎是合理的整体:Python 2.7版:在PriorityQueue中

from Queue import PriorityQueue 
    pq = PriorityQueue() 
    pq.put((0, "hello")) 
    pq.put((0, "oh")) 
    pq.put((0, "h")) 

,如果我做一个pq.get()我得到以下顺序的元素:

pq.get() 
h 
pq.get() 
hello 
pq.get() 
oh 

这是奇怪的,他们都是相同的优先级但他们没有在它们被放入的顺序给出。 有没有办法来实现这一目标?

回答

0

docs

最低值项首先检索(最低值项是一个通过排序(列表(条目返回))[0])。

由于您没有指定优先级,它将按照数据的排序顺序返回它们。

如果你想保持插入顺序,一种方法是保持一个插入计数器,并插入(count, item)元组而不是原始项。

+0

我认为PascalvKooten提到的时间可以用作计数器。 – Har

1

优先级队列确实对元组heapq排序(如在评论中指出)(其中第一个值第一计数,并在遇到第一个“列”相等时,将比较秒)。

你得到的结果,因为在排序字符串,h < hello < ohTrue

documentation

构造一个优先级队列。 maxsize是一个整数,用于设置可以放入队列中的项目数的上限。一旦达到此大小,插入将会阻塞,直到消耗队列项目。如果maxsize小于或等于零,则队列大小是无限的。

你实际上可能考虑增加一个时间常数您的实际优先级。例如。如果你有“解决问题”的优先级为0,而“解决一些小错误”优先级为1,并在每个更多的任务,如果你真的关心的顺序,你把他们在,你可以添加一个加权时间常数,或者只是为任务数量添加一个非常小的值。

例如添加:

import time 
    pq.put((0 + time.time()*0.0000000001, "hello")) 
    pq.put((0 + time.time()*0.0000000001, "oh")) 
    pq.put((0 + time.time()*0.0000000001, "h")) 
+0

“优先级队列来说确实对元组排序” - 不完全。它以相同的顺序返回项目,就像它进行排序一样,但是它使用了一个堆,比混合插入和删除更有效,而不是做很多种类。 – user2357112

+0

@ user2357112是的,措辞不好,谢谢。 – PascalVKooten