Python bisect模块的使用方法及源码实现
2018-12-29 17:05
92 查看
在平时使用python对list进行操作时,有时候会遇到这种情况:我们想要向一个已经排序好的list插入新元素,但不想改变原list的顺序,也就是说新元素的目标是插入到符合原list顺序的位置(比如数字2作为新元素被插入list[1, 3, 4]后,list应变成[1, 2, 3, 4]),bisect模块刚好可以实现这个简单的需求。
bisect模块提供了如下几个方法:
假设a为一个有序的list,x为新元素,lo和hi作为边界index规定了函数的一个查询子集(即a[lo: hi])。
- bisect.bisect_left(a, x, lo=0, hi=len(a))
def bisect_left(a, x, lo=0, hi=None): """返回x插入a后所在位置的index(如果a中存在与x等值的元素,则插入到左侧)""" 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 a[mid] < x: lo = mid+1 else: hi = mid return lo
- bisect.bisect_right(a, x, lo=0, hi=len(a))
def bisect_right(a, x, lo=0, hi=None): """返回x插入a后所在位置的index(如果a中存在与x等值的元素,则插入到右侧)""" 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.insort_left(a, x, lo=0, hi=len(a))
def insort_left(a, x, lo=0, hi=None): """将x插入a(如果a中存在与x等值的元素,则插入到左侧)""" 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 a[mid] < x: lo = mid+1 else: hi = mid a.insert(lo, x)
- bisect.insort_right(a, x, lo=0, hi=len(a))
def insort_right(a, x, lo=0, hi=None): """将x插入a(如果a中存在与x等值的元素,则插入到右侧)""" 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 a.insert(lo, x)
ps. 如果lo和hi是大于len(a)的数字,以上函数并不会报错或者仅仅出现list index out of range的错误,而是会耐心的去把x插入到a[lo: hi]中(因为此时a[lo: hi]为[],故x肯定会作为第一个元素插入到这个空子集内,index的返回结果也必为lo)。这种错误的用法当然也会导致错误的结果,导致新元素被排在了a的最后。
参考 https://docs.python.org/2/library/bisect.html#module-bisect
相关文章推荐
- python使用smtplib模块通过gmail实现邮件发送的方法
- 在Python中关于使用os模块遍历目录的实现方法
- python使用PIL模块实现给图片打水印的方法
- Python使用logging模块实现打印log到指定文件的方法
- python使用fileinput模块实现逐行读取文件的方法
- python使用PIL模块实现给图片打水印的方法
- python使用smtplib模块通过gmail实现邮件发送的方法
- Python使用re模块实现信息筛选的方法
- Python optionParser模块的使用方法
- python中bisect模块的使用
- 使用SharedStore的Python实现方法
- Python:使用threading模块实现多线程编程四[使用Lock互斥锁]
- python使用urllib模块和pyquery实现阿里巴巴排名查询
- python 反编译模块uncompyle2的使用--附破解wingide5 方法
- python simplejson模块的使用方法
- Python:使用threading模块实现多线程编程二[两种方式起线程]
- Python 使用urllib2模块实现断点续传下载
- Python set模块使用方法
- python中getattr函数使用方法 getattr实现工厂模式
- 基于nginx实现缓存功能及uptream模块详细使用方法