WMX · 随记
·Python· 3 分钟阅读

bisect:在有序列表里找插入点与重复区间

寻找一个值的位置时,列表可能含有重复项。二分查找不仅能判断成员,还能找到相同值区间的左右边界。

Python 系列概览:输入校验、数据处理与行为验证
Python 系列概览:输入校验、数据处理与行为验证 点击图片查看大图 ↗

问题从哪里出现

寻找一个值的位置时,列表可能含有重复项。二分查找不仅能判断成员,还能找到相同值区间的左右边界。

理解核心机制

bisect_left 返回相同值之前的插入点,bisect_right 返回相同值之后的插入点。两者差值就是有序列表中该值的出现次数。前提是列表始终遵守同一排序规则。

动手做一个小实验

Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。

Python8 行 · 可横向滚动
from bisect import bisect_left, bisect_right, insort
values = [1, 3, 3, 5]
left = bisect_left(values, 3)
right = bisect_right(values, 3)
assert values[left:right] == [3, 3]
insort(values, 4)
assert values == [1, 3, 3, 4, 5]
print(left, right, values)

适用边界与常见误区

查找位置是对数复杂度,但在普通列表中插入仍需要移动元素,通常是线性成本。频繁更新的大数据集可能需要其他结构。

继续练习

测试不存在的值以及小于最小值、大于最大值的情况,再用区间边界实现闭区间计数。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档