流畅的Python之奇技淫巧(二)

续接上…

2.8 用 bisect 来管理已排序的序列(关于bisect模块的学习)

注! ☆这是一个python的针对有序数组插入排序操作的一个模块
     ☆故使用这个模块的函数前先确保操作的列表是已排序

奇技淫巧之bisect模块的巧妙使用

  • 首先看下bisect模块结构内容.
>>>import bisect
>>> dir(bisect)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'bisect', 'bisect_left', 'bisect_right', 'insort', 'insort_left', 'insort_right']
# 或者采用这种方式好看一点
>>> import bisect
>>> [print(i) for i in dir(bisect)if i.find('__') == -1]
bisect
bisect_left
bisect_right
insort
insort_left
insort_right
[None, None, None, None, None, None]
>>> 
  • 1.其实bisect 就是在调用 bisect_right

    • (1)首先直接调用bisect.bisect(li, 3)来看看

      import bisect
      
      li = [1, 23, 45, 12, 23, 42, 54, 123, 14, 52, 3]
      li.sort()
      print(li)  # 此时 排序后的li = [1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123]
      print(bisect.bisect(li, 3))

      输出为↓↓↓↓↓↓↓↓↓↓↓↓↓

      [1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123]
      2
    • (2)然后调用bisect.bisect_right(li, 3)在看

      import bisect
      
      li = [1, 23, 45, 12, 23, 42, 54, 123, 14, 52, 3]
      li.sort()
      print(li)  # 此时 排序后的li = [1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123]
      print(bisect.bisect_right(li, 3))

      输出为↓↓↓↓↓↓↓↓↓↓↓↓↓

      [1, 3, 12, 14, 23, 23, 42, 45, 52, 54, 123]
      2
    • (3)查看源码bisect_right(a, x, lo=0, hi=None)
           ——其目的在于查找该数值将会插入的位置并返回,而不会插入。如果x存在在a中则返回x右边的位置
      def bisect_right(a, x, lo=0, hi=None):
          # a 原列表
          # x 插入的元素
          # lo 起始位置 默认值为0
          # hi 结束位置 默认值为len(a)   
      
          # 如果起始位置小于0 则报错
          if lo < 0:
              raise ValueError('lo must be non-negative')
          # 如果没有 结束位置 则 默认为 列表的长度
          if hi is None:
              hi = len(a)
          # 二分法
          while lo < hi:
              mid = (lo+hi)//2
              if x < a[mid]: hi = mid
              else: lo = mid+1
          # 仅返回位置
          return lo 
      
      bisect = bisect_right   # backward compatibility  ☆该注释存在源码中
  • 2.我们再来看bisect_left()
    • (1)首先我们调用bisect.bisect_left(li, 3)


      输出为↓↓↓↓↓↓↓↓↓↓↓↓↓

你可能感兴趣的:(流畅的Python)