所以我理解你可以在使用heapq模块创建一个基本上包含(key,value)对的堆时使用元组而不是直值。
我也知道你可以覆盖heapq模块的__lt__
比较运算符,以便在创建和维护堆时进行自己的比较。
有没有办法覆盖这个运算符,以便比较元组的两个值?例如,我试图让heapq比较元组的第二个值,如果第一个值与以下内容相等:
def __lt__(self, other):
return self[0] < other[0] if self[0] != other[0] else other[1] < self[1]
后半部分other[1] < self[1]
有意颠倒,因为逻辑是具有更大第二值的元组应该被认为是两者中的较小者。
感谢您提前获得任何见解!
编辑:我觉得我对术语与#34;重载&#34;之间的差异感到困惑。和&#34;覆盖&#34;。覆盖是我所指的。
答案 0 :(得分:1)
是的,那会有效。为了阐明使用heapq
的自定义类的整个过程,以下是我编写的测试脚本的一些摘录,试图了解asyncio
。为了跟踪在不同时间发生的计时器,我定义了这个类:
class TimerTask :
"actions to be invoked at specific times."
def __init__(self, when, action) :
self.when = when
self.action = action
#end __init__
def __lt__(a, b) :
return \
a.when < b.when
#end __lt__
#end TimerTask
这样的行会在待处理队列中放置TimerTask
:
heapq.heappush(self.pending, self.TimerTask(when, trigger_sleep_done))
然后,此序列等待最早的待处理计时器到期并调用其相应的操作:
try :
until = self.pending[0].when
except IndexError :
# nothing more for event loop to do
break
#end try
now = time.time()
if until > now :
time.sleep(until - now)
#end if
heapq.heappop(self.pending).action()