续接上…
2.8 用 bisect 来管理已排序的序列(关于bisect模块的学习)
注! ☆这是一个
python
的针对有序数组的插入和排序操作的一个模块
☆故使用这个模块的函数前先确保操作的列表是已排序的
※奇技淫巧之bisect模块的巧妙使用
- 首先看下
bisect
模块结构内容.
>>>import bisect
>>> dir(bisect)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'bisect', 'bisect_left', 'bisect_right', 'insort', 'insort_left', 'insort_right']
# 或者采用这种方式好看一点
>>> import bisect
>>> [print(i) for i in dir(bisect)if i.find('__') == -1]
bisect
bisect_left
bisect_right
insort
insort_left
insort_right
[None, None, None, None, None, None]
>>>
1.其实
bisect
就是在调用bisect_right
(1)首先直接调用
bisect.bisect(li, 3)
来看看import bisect li = [1, 23, 45, 12, 23, 42, 54, 123, 14, 52, 3] li.sort() print(li) # 此时 排序后的li = [1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123] print(bisect.bisect(li, 3))
输出为↓↓↓↓↓↓↓↓↓↓↓↓↓
[1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123] 2
(2)然后调用
bisect.bisect_right(li, 3)
在看import bisect li = [1, 23, 45, 12, 23, 42, 54, 123, 14, 52, 3] li.sort() print(li) # 此时 排序后的li = [1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123] print(bisect.bisect_right(li, 3))
输出为↓↓↓↓↓↓↓↓↓↓↓↓↓
[1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123] 2
- (3)查看源码
bisect_right(a, x, lo=0, hi=None)
——其目的在于查找
该数值将会插入的位置并返回
,而不会插入
。如果x
存在在a
中则返回x右边的位置
def bisect_right(a, x, lo=0, hi=None): # a 原列表 # x 插入的元素 # lo 起始位置 默认值为0 # hi 结束位置 默认值为len(a) # 如果起始位置小于0 则报错 if lo < 0: raise ValueError('lo must be non-negative') # 如果没有 结束位置 则 默认为 列表的长度 if hi is None: hi = len(a) # 二分法 while lo < hi: mid = (lo+hi)//2 if x < a[mid]: hi = mid else: lo = mid+1 # 仅返回位置 return lo bisect = bisect_right # backward compatibility ☆该注释存在源码中
- 2.我们再来看
bisect_left()
- (1)首先我们调用
bisect.bisect_left(li, 3)
输出为↓↓↓↓↓↓↓↓↓↓↓↓↓
- (1)首先我们调用