本文基于Python3.7分析
1. 模块简介
- bisect模块属于Python内置模块
- 内部核心算法是二分法
- 用于操作的列表必须是升序的(空列表也可以)
- 功能: 在保证原有顺序的情况下, 插入一个元素(或返回元素如果插入的下标值),不影响原有顺序
2. 源码分析及使用
2.1. 方法概述
bisect提供了六个方法:
- 查找: 返回元素按照顺序应该插入的位置, 但不会修改原列表
方法 解释 bisect.bisect() 遇到重复值时,按照最右边返回 bisect.bisect_left() 遇到重复值时,按照最左边返回 bisect.bisect_right() 遇到重复值时,按照最右边返回 - 插入: 将元素插入到列表中, 不影响原有顺序
方法 解释 bisect.insort() 遇到重复值, 插入到最右边 bisect.insort_left() 遇到重复值, 插入到最左边 bisect.insort_right() 遇到重复值, 插入到最右边
不难发现, bisect()方法和bisect_right()方法以及insort()方法和insort_right()方法功能一致, 在下面源码分析中会有解释
2.2. 使用
import bisect
l = [1, 2, 4, 4, 5]
n = 4
idx1 = bisect.bisect(l, n)
print(idx1)
# 4
idx2 = bisect.bisect_left(l, n)
print(idx2)
# 2
idx3 = bisect.bisect_right(l, n)