bisect
模块包含两个主要函数,bisect
和insort
,两个函数都利用二分查找算法来在有序序列中查找或插入元素。
2.8.1 用 bisect
来搜索
bisect 用来搜索 x 在假设插入序列 n 后,然后再对 n 排序之后的索引位置,实际上 x 并不在 n 中;
bisect(n, x) 有2个必须参数:
- n : 被搜索的序列;
- x : 要搜索的对象;
from bisect import bisect
n = [3, 1, 4, 2, 8, 6] # 模拟排序后的结果 [1, 2, 3, 4, 6, 8]
x = bisect(n, 5) # 模拟插入后 5 的索引 [1, 2, 3, 4, 5, 6, 8]
print(x) # 4,x 可能会出现的索引位置为 4
如果 x 在 n 中有重复,则默认索引位置是在最右侧相同值的右侧,也就是相同值中的最后面:
from bisect import bisect
n = ['c', 'b', 'e', 'z', 'f', 'b'] # 模拟排序后的结果 ['b', 'b', 'c', 'e', 'f', 'z']
y = bisect(n, 'b') # # 模拟插入后 'b' 的索引 ['b', 'b', 'b', 'c', 'e', 'f', 'z']
print(y) # 2, y 可能会出现的索引位置为 2
bisect_left 则恰恰相反,如果 x 在 n 中有重复,则默认索引位置是在最左侧相同值的左侧,也就是相同值中的最前面:
from bisect import bisect_left
n = ['c', 'b', 'e', 'z', 'f', 'b'] # 模拟排序后的结果 ['b', 'b', 'c', 'e', 'f', 'z']
y = bisect_left(n, 'b') # # 模拟插入后 'b' 的索引 ['b', 'b', 'b', 'c', 'e', 'f', 'z']
print(y) # 0, y 可能会出现的索引位置为 0
2.8.2 用 insort
插入新元素
排序很耗时,因此在得到一个有序序列之后,我们最好能够保持它的有序,bisect.insort
就是为了这个而存在的。
insort
(n, x) 有2个必须参数:
- n : 被插入的序列;
- x : 要插入的对象;
假设 n 已经排序,在不破坏 n 的排序的情况下,将 x 插入 n 中:
from bisect import insort
t = [1, 3, 5, 7, 9]
insort(t, 6)
print(t) # [1, 3, 5, 6, 7, 9]
如果 x 在 n 中有重复,则将 x 插入到相同值的最右侧:
t = [1, 3, 5, 7, 9]
insort(t, 5)
print(t) # [1, 3, 5, 5, 7, 9]
insort_left 则恰恰相反,它是将 x 插入到相同值的最左侧;