在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 稍微改变一下。 有可能吗?
答案 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生成断路器)。