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
相关产品推荐
相关产品推荐

