Python priority_queue放入列表编号

时间:2017-02-28 22:13:07

标签: python cython priority-queue

在python模块中,如priority_queue, 但是我输入了整数列表,它会将它与列表中的最大值进行比较。

实施例

priority_queue qu
a = [1,1,1,5]
b = [2,4,7,2]
c = [1,2,2]
qu.put(c)
qu.put(b)
qu.put(a)

qu.get() #will be b = [2,4,7,2], because max(b)=7 > max(a) > max(c)
qu.get() #will be a = [1,1,1,5], because max(a)=5 > max(c)
qu.get() #will be c = [1,2,3] 
#compare lsit by thier max value

我希望这个队列尽可能快。 如果不存在模块,则可能是带有c ++ priority_queue的cython 稍微改变一下。 有可能吗?

1 个答案:

答案 0 :(得分:1)

在插入时创建自己的密钥,并插入与列表配对的密钥:

a = [1,1,1,5]
b = [2,4,7,2]
c = [1,2,2]
# Use -max as key, since queue is ordered by smallest key
qu.put((-max(c), c))
qu.put((-max(b), b))
qu.put((-max(a), a))

qu.get()[1] #will be b = [2,4,7,2], because max(b)=7 > max(a) > max(c)
qu.get()[1] #will be a = [1,1,1,5], because max(a)=5 > max(c)
qu.get()[1] #will be c = [1,2,2] 

您可以编写一个简单的PriorityQueue子类,以便在put上自动完成此键控,并在需要时剥离get。最简单的版本是:

class ByMaxPriorityQueue(PriorityQueue):
    # Threadsafe way to generate a simple tiebreaker value
    tiebreaker = itertools.count()

    def put(self, val, *args, **kwargs):
        super().put((-max(val), next(self.tiebreaker), val), *args, **kwargs)
    def get(self, *args, **kwargs):
        key, tie, val = super().get(*args, **kwargs)
        return val

该类将完全按照您的需要运行,而无需手动创建和删除键值(并且它将使用先到put的决胜局,而不是词典列表比较,这要归功于使用{{1生成断路器)。