Python 使用元组时覆盖 heapq 比较
Python overriding heapq comparison when using tuples
所以我了解到,在使用 heapq 模块创建基本上包含(键,值)对的堆时,您可以使用元组而不是直接值。
我还知道您可以覆盖 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]
是故意颠倒的,因为逻辑是第二个值较大的元组应被视为两者中较小的一个。
感谢您提前提供任何见解!
编辑:我想我对术语 "overload" 和 "override" 之间的差异感到困惑。覆盖是我指的。
是的,那行得通。为了阐明将自定义 class 与 heapq
结合使用的整个过程,以下是我编写的测试脚本的一些摘录,以试图掌握 asyncio
。为了跟踪在不同时间关闭的计时器,我定义了这个 class:
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()
所以我了解到,在使用 heapq 模块创建基本上包含(键,值)对的堆时,您可以使用元组而不是直接值。
我还知道您可以覆盖 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]
是故意颠倒的,因为逻辑是第二个值较大的元组应被视为两者中较小的一个。
感谢您提前提供任何见解!
编辑:我想我对术语 "overload" 和 "override" 之间的差异感到困惑。覆盖是我指的。
是的,那行得通。为了阐明将自定义 class 与 heapq
结合使用的整个过程,以下是我编写的测试脚本的一些摘录,以试图掌握 asyncio
。为了跟踪在不同时间关闭的计时器,我定义了这个 class:
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()