这篇文章主要介绍“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 bisectls = [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 bisectls = [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 bisectls = [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
关于“Python3二分查找库函数bisect(),bisect_left()和bisect_right()的区别是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。