赞
踩
前提:列表有序!!!
bisect()和bisect_right()等同,那下面就介绍bisect_left()和bisec_right()的区别!
用法:
index1 = bisect(ls, x) #第1个参数是列表,第2个参数是要查找的数,返回值为索引
index2 = bisect_left(ls, x)
index3 = bisec_right(ls, x)
bisect.bisect和bisect.bisect_right返回大于x的第一个下标(相当于C++中的upper_bound),bisect.bisect_left返回大于等于x的第一个下标(相当于C++中的lower_bound)。
case1
如果列表中没有元素x,那么bisect_left(ls, x)和bisec_right(ls, x)返回相同的值,该值是x在ls中“合适的插入点索引,使得数组有序”。此时,ls[index2] > x,ls[index3] > x。
import bisect
ls = [1,5,9,13,17]
index1 = bisect.bisect(ls,7)
index2 = bisect.bisect_left(ls,7)
index3 = bisect.bisect_right(ls,7)
print("index1 = {}, index2 = {}, index3 = {}".format(index1, index2, index3))
程序运行结果为,
index1 = 2, index2 = 2, index3 = 2
case2
如果列表中只有一个元素等于x,那么bisect_left(ls, x)的值是x在ls中的索引,ls[index2] = x。而bisec_right(ls, x)的值是x在ls中的索引加1,ls[index3] > x。
import bisect
ls = [1,5,9,13,17]
index1 = bisect.bisect(ls,9)
index2 = bisect.bisect_left(ls,9)
index3 = bisect.bisect_right(ls,9)
print("index1 = {}, index2 = {}, index3 = {}".format(index1, index2, index3))
程序运行结果为,
index1 = 3, index2 = 2, index3 = 3
case3
如果列表中存在多个元素等于x,那么bisect_left(ls, x)返回最左边的那个索引,此时ls[index2] = x。bisect_right(ls, x)返回最右边的那个索引加1,此时ls[index3] > x。
import bisect
ls = [1,5,5,5,17]
index1 = bisect.bisect(ls,5)
index2 = bisect.bisect_left(ls,5)
index3 = bisect.bisect_right(ls,5)
print("index1 = {}, index2 = {}, index3 = {}".format(index1, index2, index3))
程序运行结果为,
index1 = 4, index2 = 1, index3 = 4
(一)
j = bisect.bisect_right(rides, start, hi = i - 1, key = lambda x : x[1])
rides
:这是一个列表,已经按顺序排列。
start
:这是我们要在rides
中查找的元素。
hi = i - 1
:这是查找的上界。具体而言,在[0, hi)
这个左闭右开区间中,寻找满足rides[x][1] > start
且x
最小的case,返回x
。如果没有找到,则返回hi
。
key = lambda x : x[1]
:这是用于比较的元素。默认情况下,bisect_right
比较元素x
的值,而这里表示比较元素x
的下标等于1的元素的值(说明元素x
是一个列表或元组等等),即x[1]
。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。