为何Python中bisect操作普通列表和嵌套列表返回结果不一致
两个bisect操作返回结果不同的核心原因
差异来源于Python内置的序列比较规则和bisect模块的默认查找逻辑共同作用:
- bisect.bisect本质是
bisect.bisect_right,返回的插入点会位于所有和目标值相等的元素右侧,保证插入目标后原序列仍保持升序。
第一个调用行为解释
bisect.bisect([0,3], 3)
列表元素为整数,目标值3和列表下标为1的元素相等,bisect_right返回相等元素的右侧插入点,因此结果为2,符合预期。
第二个调用行为解释
bisect.bisect([[0, 0], [3, 50]], [3])
这里涉及Python的序列比较规则:两个序列比较时会按索引逐个对比元素,直到找到第一个不相等的元素,该元素的大小关系就是两个序列的大小关系;如果短序列的所有元素都和长序列对应位置的元素相等,则判定短序列更小。
查找目标[3]和原列表的两个元素的对比结果如下:
- 和
[0, 0]对比:第一个元素0 < 3,因此[0, 0] < [3] - 和
[3, 50]对比:第一个元素3相等,但[3]长度更短,因此判定[3] < [3, 50]
因此目标[3]的插入点位于[3, 50]的左侧,下标为1,最终返回结果为1而非2。
内容的提问来源于stack exchange,提问作者Fangda Han
相关产品推荐
相关产品推荐

