Python在使用元组时覆盖heapq比较

时间:2017-10-18 22:17:15

标签: python tuples comparison-operators

所以我理解你可以在使用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;。覆盖是我所指的。

1 个答案:

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