bisect 是python的一个二分查找算法模块,可以在已排序的列表等序列容器中查找与插入值。
函数集:
(1)bisect.
bisect_left
(a,x, lo=0, hi=len(a))
如果x在a中,该函数会返回x的位置,如果不在,那么返回最后一个小于x的值的位置。(lo 与 hi 用于设定查找的子列表)
a = [0,1,2,3,4,5,6,7,8]
bisect.bisect_left(a,4) # 返回4
a = [0,1,2,3,4,6,7,8]
bisect.bisect_left(a,4) # 返回4
bisect.bisect_left(a,4,3,8) #在下标区间[3,8]中查找 返回依然是4
该方法主要是查找已排序的list中,某个值插入的位置(因为不能破坏排序性质)
(2)bisect.bisect_right(a,x,lo=0,hi=len(a)) 与 bisect.
bisect
(a, x, lo=0, hi=len(a)) (两个函数一样)
作用与(1)类似,但是此方法对于x在a中时返回该值右边第一个位置。
a = [0,1,2,3,4,5,6,7,8]
bisect.bisect_left(a,4) #返回 5
(3)bisect.
insort_left
(a, x, lo=0, hi=len(a))
先调用bisect.
bisect_left
找到插入位置,再插入x。(如果x在a中,新插入的x正好在原来的x的左边)
a = [0,1,2,3,4,5,6,7,8]
bisect.insort_left(a,4) #a = [0,1,2,3,4(插入),4,5,6,7,8]
(4)
bisect.
insort_right
(
a,
x,
lo=0,
hi=len(a)
) 与
bisect.
insort
(
a,
x,
lo=0,
hi=len(a)
)
与(3)类似,只是此时当x存在与a中时,插在x的右边。
a = [0,1,2,3,4,5,6,7,8]
bisect.insort_right(a,4) #a = [0,1,2,3,4,4(插入),5,6,7,8]
该模块源代码是python写的,同时要求list的已经排序好的,在某些需要速度的场合可能会用的到。
list对象的某些方法其实可以起到有同样的功能,比如insert(x)返回下标。in 关键字也可以判断x是否在特定的list中,而管理有序集合也有heapq等高效的模块。