Python优先级队列heapify失败:字典间不支持比较的原因探究
问题原因解析
Python中元组的比较是按元素顺序依次进行的:当对比两个元组时,先比较第一个元素,若相等则继续对比第二个元素,以此类推。
在报错的场景里,priority_q存在两个第一个元素同为200的元组:
(200, {'intel-labels': {'timestamp': 200}}), (200, {'intel-labels': {'timestamp': 200, 'xx': 'xx'}})
当heapq.nlargest(2, priority_q)执行时,需要确定这两个元组的优先级顺序。由于第一个元素相等,Python会尝试比较它们的第二个元素——也就是两个字典。但Python的字典默认不支持用<或>运算符进行比较,这直接触发了TypeError。
而当你把第三个元素的优先级改为201后,三个元组的第一个元素分别是150、200、201。nlargest(2)要取最大的两个元素时,仅通过比较元组的第一个元素就能确定顺序(201 > 200 > 150),完全不需要涉及第二个元素(字典)的比较,因此代码可以正常执行。
注:heapq.heapify操作不影响报错与否,因为nlargest的比较逻辑基于元组本身的规则,和堆结构无关。
内容的提问来源于stack exchange,提问作者Sam Comber
相关产品推荐
相关产品推荐

