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()