这篇文章主要介绍“Python3二分查找库函数bisect(),bisect_left()和bisect_right()的区别是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python3二分查找库函数bisect(),bisect_left()和bisect_right()的区别是什么”文章能帮助大家解决问题。
前提:列表有序!!!
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)。
case 1
如果列表中没有元素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
case 2
如果列表中只有一个元素等于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
case 3
如果列表中存在多个元素等于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