python bisect使用,总结一下三条:
1. Python中的bisect用于操作排序的数组,比如你可以在向一个数组插入数据的同时进行排序。
2. 用来查找某值大于等于、小于等于、等于列表中元素位置下标。 解决牛牛找工作问题。
3. 实现查找,效率比较是:递归 < 二分查找 < bisect ,另外 numpy.searchsorted搜索numpy.ndarray类型的元素是很快。
代码如下:
1.
import bisect
import random
random.seed(1)
ls= []
r = random.randint(1, 100)
position = bisect.bisect_left(ls, r) # 其目的在于查找该数值将会插入的位置并返回,而不会插入。
bisect.insort(ls, r) # 在ls相应位置插入值r,可以不先bisect,但是调用bisect的方法,前提是ls已经是有序的了,会改变ls内容
# --------------------------------------------------------------------------------------------------------------------------
2.在python中使用字典,元素是(难易程度,薪资),然后根据难易程度排序,修改第i个人薪资为排序后前i个人最大薪资值;选取键中满足find_le(a, x)的下标的值,就是某人已知难易程度,得到获得的最大薪资值下标。根据下标就可以找到薪资了。完美的代替了java中的treemap
def index(a, x):
'Locate the leftmost value exactly equal to x'
i = bisect.bisect_left(a, x)
if i != len(a) and a[i] == x:
return i
raise ValueError
def find_lt(a, x):
'Find rightmost value less than x'
i = bisect.bisect_left(a, x)
if i:
return a[i-1]
raise ValueError
def find_le(a, x):
'Find rightmost value less than or equal to x'
i = bisect.bisect_right(a, x)
if i:
return a[i-1]
raise ValueError
def find_gt(a, x):
'Find leftmost value greater than x'
i = bisect.bisect_right(a, x)
if i != len(a):
return a[i]
raise ValueError
def find_ge(a, x):
'Find leftmost item greater than or equal to x'
i = bisect.bisect_left(a, x)
if i != len(a):
return a[i]
raise ValueError
# -----------------------------------------------------------------
# 我们可以用 bisect 模块实现二分查找:
def binary_search_bisect(lst, x):
from bisect import bisect_left
i = bisect_left(lst, x)
if i != len(lst) and lst[i] == x:
return i
return None