You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python自定义堆重写__lt__方法后堆顶元素不符合预期问题求助

问题成因
  • Python的魔法方法__lt__要求返回布尔类型的比较结果,你当前实现返回的是两个val1的差值(整数类型),Python会自动将整数转为布尔值判断:非0整数一律视为True,0视为False,直接导致比较逻辑完全错误。
    具体对应你的测试场景:当你向堆中插入第二个元素MyObjects(4,17)时,堆会将它和已有的堆顶元素MyObjects(4,9)做__lt__比较,此时执行17 - 9 = 8,返回的整数8被判定为True,堆就会认为17 < 9成立,因此将[4,17]放在了堆顶,和你的预期完全相反。
修复方案

只需要修改__lt__方法的实现,直接返回val1的布尔比较结果即可:

import heapq

class MyObjects:
    def __init__(self, val0, val1):
        self.val0 = val0
        self.val1 = val1
                
    def __repr__(self):
        return "[{},{}]".format(self.val0, self.val1)
                
    def __lt__(self, other):
        # 修改为返回布尔类型的比较结果
        return self.val1 < other.val1
        
heap = []
heapq.heapify(heap)

intervals = [4, 9], [4, 17], [9, 10]
for interval in intervals:
    heapq.heappush(heap, MyObjects(interval[0], interval[1]))
    print(heap[0])

修改后运行输出和预期一致,三次打印结果依次为[4,9]、[4,9]、[4,9]。

内容的提问来源于stack exchange,提问作者Yinan Wu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:36:03