当前位置:   article > 正文

Python3二分查找库函数bisect(), bisect_left()和bisect_right()介绍

bisect_left

1 基础知识

前提:列表有序!!!

bisect()和bisect_right()等同,那下面就介绍bisect_left()和bisec_right()的区别!

用法:

index1 = bisect(ls, x)   #第1个参数是列表,第2个参数是要查找的数,返回值为索引
index2 = bisect_left(ls, x)
index3 = bisec_right(ls, x)
  • 1
  • 2
  • 3

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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

程序运行结果为,

index1 = 2, index2 = 2, index3 = 2
  • 1

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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

程序运行结果为,

index1 = 3, index2 = 2, index3 = 3
  • 1

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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

程序运行结果为,

index1 = 4, index2 = 1, index3 = 4
  • 1

2 扩展知识

(一)

j = bisect.bisect_right(rides, start, hi = i - 1, key = lambda x : x[1])
  • 1

rides:这是一个列表,已经按顺序排列。

start:这是我们要在rides中查找的元素。

hi = i - 1:这是查找的上界。具体而言,在[0, hi)这个左闭右开区间中,寻找满足rides[x][1] > startx最小的case,返回x。如果没有找到,则返回hi

key = lambda x : x[1]:这是用于比较的元素。默认情况下,bisect_right比较元素x的值,而这里表示比较元素x的下标等于1的元素的值(说明元素x是一个列表或元组等等),即x[1]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/177519?site
推荐阅读
相关标签
  

闽ICP备14008679号