当前位置:   article > 正文

bisect——模块_bisect_left

bisect_left

bisect

​ ——这是一个python的针对有序 数组的插入和排序操作的一个模块

首先看看bisect这个模块中都有什么方法吧

  1. import bisect
  2. [print(i) for i in dir(bisect)if i.find('__') == -1]
  3. bisect
  4. bisect_left
  5. bisect_right
  6. insort
  7. insort_left
  8. insort_right

bisect 就是调用的bisect_right

insort 就是调用 的insort_right


bisect

​ —— 其实bisect 就是在调用 bisect_right

  1. import bisect
  2. li = [1, 23, 45, 12, 23, 42, 54, 123, 14, 52, 3]
  3. li.sort()
  4. print(li)
  5. print(bisect.bisect(li, 3))
  1. [1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123]
  2. 2
  •  

不信你看源码

bisect = bisect_right   # backward compatibility
  •  

一句话就可以解释

bisect_left(a, x, lo=0, hi=None)

​ ——其目的在于查找该数值将会插入的位置并返回,而不会插入。如果x存在在a中则返回x左边的位置

  1. import bisect
  2. li = [1, 23, 45, 12, 23, 42, 54, 123, 14, 52, 3]
  3. li.sort()
  4. print(li)
  5. print(bisect.bisect_left(li, 3))
  1. [1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123]
  2. 1

源码如下

  1. def bisect_left(a, x, lo=0, hi=None):
  2. # a 原列表
  3. # x 插入的元素
  4. # lo 起始位置 默认值为0
  5. # hi 结束位置 默认值为len(a)
  6. # 如果起始位置小于0 则报错
  7. if lo < 0:
  8. raise ValueError('lo must be non-negative')
  9. # 如果没有 结束位置 则 默认为 列表的长度
  10. if hi is None:
  11. hi = len(a)
  12. # 二分法
  13. while lo < hi:
  14. mid = (lo+hi)//2
  15. if a[mid] < x: lo = mid+1
  16. else: hi = mid
  17. # 仅返回位置
  18. return lo

bisect_right(a, x, lo=0, hi=None)

​ ——其目的在于查找该数值将会插入的位置并返回,而不会插入。如果x存在在a中则返回x右边的位置

  1. import bisect
  2. li = [1, 23, 45, 12, 23, 42, 54, 123, 14, 52, 3]
  3. li.sort()
  4. print(li)
  5. print(bisect.bisect_right(li, 3))
  1. [1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123]
  2. 2
  •  

源码如下

  1. def bisect_right(a, x, lo=0, hi=None):
  2. # a 原列表
  3. # x 插入的元素
  4. # lo 起始位置 默认值为0
  5. # hi 结束位置 默认值为len(a)
  6. # 如果起始位置小于0 则报错
  7. if lo < 0:
  8. raise ValueError('lo must be non-negative')
  9. # 如果没有 结束位置 则 默认为 列表的长度
  10. if hi is None:
  11. hi = len(a)
  12. # 二分法
  13. while lo < hi:
  14. mid = (lo+hi)//2
  15. if x < a[mid]: hi = mid
  16. else: lo = mid+1
  17. # 仅返回位置
  18. return lo

 

insort

​ —— 在列表a中插入元素x,并在排序后保持排序。如果x已经在a中,把它插入右x的右边。

  1. import bisect
  2. li = [1, 23, 45, 12, 23, 42, 54, 123, 14, 52, 3]
  3. li.sort()
  4. print(li)
  5. bisect.insort(li, 3.0)
  6. print(li)
  1. [1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123]
  2. [1, 3, 3.0, 12, 14, 23, 23, 42, 45, 52, 54, 123]

​ —— 其实insort 就是在调用 insort_right

不信你看源码

insort = insort_right   # backward compatibility
  •  

一句话就可以解释

insort_left(a, x, lo=0, hi=None)

​ —— 在列表a中插入元素x,并在排序后保持排序。如果x已经在a中,把它插入右x的左边。

  1. import bisect
  2. li = [1, 23, 45, 12, 23, 42, 54, 123, 14, 52, 3]
  3. li.sort()
  4. print(li)
  5. bisect.insort_left(li, 3.0)
  6. print(li)
  1. [1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123]
  2. [1, 3.0, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123]

源码如下

  1. def insort_left(a, x, lo=0, hi=None):
  2. # a 原列表
  3. # x 插入的元素
  4. # lo 起始位置 默认值为0
  5. # hi 结束位置 默认值为len(a)
  6. # 如果起始位置小于0 则报错
  7. if lo < 0:
  8. raise ValueError('lo must be non-negative')
  9. # 如果没有 结束位置 则 默认为 列表的长度
  10. if hi is None:
  11. hi = len(a)
  12. # 二分查找
  13. while lo < hi:
  14. mid = (lo+hi)//2
  15. if a[mid] < x: lo = mid+1
  16. else: hi = mid
  17. # 插入
  18. a.insert(lo, x)

insort_right(a, x, lo=0, hi=None)

​ —— 在列表a中插入元素x,并在排序后保持排序。如果x已经在a中,把它插入右x的右边。

  1. import bisect
  2. li = [1, 23, 45, 12, 23, 42, 54, 123, 14, 52, 3]
  3. li.sort()
  4. print(li)
  5. bisect.insort_right(li, 3.0)
  6. print(li)


[1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123]
[1, 3.0, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123]

源码如下

  1. def insort_right(a, x, lo=0, hi=None):
  2. # a 原列表
  3. # x 插入的元素
  4. # lo 起始位置 默认值为0
  5. # hi 结束位置 默认值为len(a)
  6. # 如果起始位置小于0 则报错
  7. if lo < 0:
  8. raise ValueError('lo must be non-negative')
  9. # 如果没有 结束位置 则 默认为 列表的长度
  10. if hi is None:
  11. hi = len(a)
  12. # 二分法查找
  13. while lo < hi:
  14. mid = (lo+hi)//2
  15. if x < a[mid]: hi = mid
  16. else: lo = mid+1
  17. # 插入
  18. a.insert(lo, x)
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/177474
推荐阅读
  

闽ICP备14008679号