在有序列表中找一个数,bisect_left返回适合插入的位置,而不是“找到或找不到”的直接答案。使用结果前还要检查位置是否越界,以及当前位置的值是否相等。

有序输入是使用前提
示例列表为2、4、4、8。查找4得到最左侧的4所在位置;查找5得到8之前的插入位置。输入若没有按同样规则排序,就不能期待结果有查找意义,也不要每次查询都悄悄改变原数据顺序。
先检查长度再读取元素
查找9时位置等于列表长度,直接读取会越界。下例用短路条件先判断边界,再比较数值,覆盖重复值、缺失值和空列表。若要取得右侧插入点,应理解bisect_right的不同约定。
查找快不等于插入也快
在列表中移动元素仍可能需要线性工作量。使用insort维护顺序时,不能只看二分查找部分就声称整个操作是对数时间。先根据查询次数、插入次数与数据规模决定是否适合。
可以运行的练习
from bisect import bisect_left
def contains(values, target):
index = bisect_left(values, target)
return index < len(values) and values[index] == target
values = [2, 4, 4, 8]
assert bisect_left(values, 4) == 1
assert contains(values, 4)
assert not contains(values, 5)
assert not contains(values, 9)
assert not contains([], 1)
print("存在、缺失与空列表检查通过")
示例已在本地隔离环境运行检查。使用固定输入,不访问外部接口,也不读取真实业务文件。
资料与继续学习
Python:bisect二分查找。资料查阅日期:2026年10月3日。步骤与练习由本站整理。
资料查阅与编辑日期:2026年10月3日。作者:玖柒。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END






