如何在python中颠倒PriorityQueue的顺序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在python中颠倒PriorityQueue的顺序?相关的知识,希望对你有一定的参考价值。

我在python中创建了一个简单的优先级队列,按其值对项目进行排序:

import Queue
q = Queue.PriorityQueue()
for it in items:
    q.put((it.value, it))

但是当我使用以下方式打印队列时:

while not q.empty()
    print q.get()

它将始终首先打印最低值。有没有办法获取队列中的最后一项而不将代码顶部的最后两行更改为:

for it in items:
    q.put((-1*it.value, it))

因为这似乎有点混乱,如果我想将这些信息用于其他东西会产生问题(我必须再次将它乘以-1)

答案

您可以创建自己的继承自PriorityQueue的类,并为您进行凌乱的-1乘法:

class ReversePriorityQueue(PriorityQueue):

def put(self, tup):
    newtup = tup[0] * -1, tup[1]
    PriorityQueue.put(self, newtup)

def get(self):
    tup = PriorityQueue.get(self)
    newtup = tup[0] * -1, tup[1]
    return newtup

这似乎与元组一起使用,至少:

Q = ReversePriorityQueue()

In [94]: Q.put((1,1))

In [95]: Q.get()
Out[95]: (1, 1)

In [96]: Q.put((1,1))

In [97]: Q.put((5,5))

In [98]: Q.put((9,9))

In [99]: Q.get()
Out[99]: (9, 9)

In [100]: Q.get()
Out[100]: (5, 5)

In [101]: Q.get()
Out[101]: (1, 1)

我相信你可以将代码概括为不仅仅是来自这里的元组。

另一答案

根据定义,您只能从队列的前面检索项目。要颠倒顺序,可以将所有内容都压入堆栈,然后将项目从堆栈中弹出。由于堆栈既可以从后面添加和检索项目,也具有与撤消队列相同的效果。

另一答案

Queue.PriorityQueue的情况下

首先检索最低值的条目(最低值条目是由sorted(list(entries))[0]返回的条目。

所以你可以尝试queue.LifoQueue.It是LIFO机制。

另一答案

您可以使转换透明化。

你想要的是有一个新的q.get和一个新的q.put透明地修改进出队列的数据以反转顺序:

# new reversed priority put method
q.oldput = q.put
q.put = lambda p, i: q.oldput((p * -1, i))

# new reversed priority get method
q.oldget = q.get
# create get closure for queue
def newget(q):
    def g():
        item = q.oldget()
        # reverse first element
        return item[0] * -1, item[1]
    # return get method for given queue
    return g
# bind to queue
q.get = newget(q)

# test
items = range(10)
for it in items:
    q.put(*(it, it))

while not q.empty():
    print q.get()

如果要使用更强大的代码,我强烈建议使用类,而不仅仅是重新绑定方法。

另一答案

您可以使用自定义类而不是元组。然后你可以在cmp中做任何你喜欢的事情。

另一答案

根据spec(假设python 2.7):

The lowest valued entries are retrieved first

所以这意味着,不,你不能。

以上是关于如何在python中颠倒PriorityQueue的顺序?的主要内容,如果未能解决你的问题,请参考以下文章

python list里的list元素颠倒位置

Python 线程优先队列 PriorityQueue

如何在 O(1) 空间中打印 PriorityQueue 的降序

如何在 Python 中创建唯一值优先级队列?

Python PriorityQueue 仅获取元组的一部分

使用python和opencv进行视频分析:输入视频是颠倒的