Python bisect - array bisection library
2016-04-09 21:09
537 查看
Python的bisect模块是内置模块,bisect模块实现了一个算法用于插入元素到有序列表。
在一些情况下,这比反复排序列表或构造一个大的列表再排序的效率更高。Bisect是二分法的意思,这里使用二分法排序,将待插入的元素插入到合适的位置
bisect模块提供了如下几个函数:
(下面函数中的lo和hi用于指定列表的区间,默认的是整个列表)
bisect.bisect_left(a, x, lo=0, hi=len(a)) 返回将x插入到列表a中的索引位置,如果已有x,则返回第一个x的位置
bisect.bisect_right(a, x, lo=0, hi=len(a)) 返回将x插入到列表a中的索引位置,如果已有x,则返回最后一个x位置的下一个位置
bisect.bisect(a, x, lo=0, hi=len(a)) 与bisect_right相同
bisect.insort_left(a, x, lo=0, hi=len(a)) 将x插入到列表a中,如果已有x,插入到所有x的最左边
bisect.insort_right(a, x, lo=0, hi=len(a)) 将x插入到列表a中,如果已有x,插入到所有x的最右边
bisect.insort(a, x, lo=0, hi=len(a)) 与insort_right相同
下面看个例子:
[python] view
plain copy
print?
>>> import bisect
>>> import random
>>> mylist = list()
>>> for i in range(10):
num = random.randint(1,100)
index = bisect.bisect_left(mylist, num)
bisect.insort_left(mylist, num)
print('num ', str(num), '\tindex ', str(index), '\tlist ', mylist)
num 37 index 0 list [37]
num 31 index 0 list [31, 37]
num 82 index 2 list [31, 37, 82]
num 27 index 0 list [27, 31, 37, 82]
num 62 index 3 list [27, 31, 37, 62, 82]
num 83 index 5 list [27, 31, 37, 62, 82, 83]
num 83 index 5 list [27, 31, 37, 62, 82, 83, 83]
num 87 index 7 list [27, 31, 37, 62, 82, 83, 83, 87]
num 98 index 8 list [27, 31, 37, 62, 82, 83, 83, 87, 98]
num 99 index 9 list [27, 31, 37, 62, 82, 83, 83, 87, 98, 99]
>>> mylist = list()
>>> for i in range(10):
num = random.randint(1,100)
index = bisect.bisect_right(mylist, num)
bisect.insort_right(mylist, num)
print('num ', str(num), '\tindex ', str(index), '\tlist ', mylist)
num 85 index 0 list [85]
num 73 index 0 list [73, 85]
num 82 index 1 list [73, 82, 85]
num 36 index 0 list [36, 73, 82, 85]
num 80 index 2 list [36, 73, 80, 82, 85]
num 4 index 0 list [4, 36, 73, 80, 82, 85]
num 79 index 3 list [4, 36, 73, 79, 80, 82, 85]
num 6 index 1 list [4, 6, 36, 73, 79, 80, 82, 85]
num 64 index 3 list [4, 6, 36, 64, 73, 79, 80, 82, 85]
num 25 index 2 list [4, 6, 25, 36, 64, 73, 79, 80, 82, 85]
>>> mylist = list()
>>> for i in range(10):
num = random.randint(1,100)
index = bisect.bisect(mylist, num)
bisect.insort(mylist, num)
print('num ', str(num), '\tindex ', str(index), '\tlist ', mylist)
num 25 index 0 list [25]
num 28 index 1 list [25, 28]
num 81 index 2 list [25, 28, 81]
num 9 index 0 list [9, 25, 28, 81]
num 29 index 3 list [9, 25, 28, 29, 81]
num 66 index 4 list [9, 25, 28, 29, 66, 81]
num 34 index 4 list [9, 25, 28, 29, 34, 66, 81]
num 60 index 5 list [9, 25, 28, 29, 34, 60, 66, 81]
num 61 index 6 list [9, 25, 28, 29, 34, 60, 61, 66, 81]
num 3 index 0 list [3, 9, 25, 28, 29, 34, 60, 61, 66, 81]
在一些情况下,这比反复排序列表或构造一个大的列表再排序的效率更高。Bisect是二分法的意思,这里使用二分法排序,将待插入的元素插入到合适的位置
bisect模块提供了如下几个函数:
(下面函数中的lo和hi用于指定列表的区间,默认的是整个列表)
bisect.bisect_left(a, x, lo=0, hi=len(a)) 返回将x插入到列表a中的索引位置,如果已有x,则返回第一个x的位置
bisect.bisect_right(a, x, lo=0, hi=len(a)) 返回将x插入到列表a中的索引位置,如果已有x,则返回最后一个x位置的下一个位置
bisect.bisect(a, x, lo=0, hi=len(a)) 与bisect_right相同
bisect.insort_left(a, x, lo=0, hi=len(a)) 将x插入到列表a中,如果已有x,插入到所有x的最左边
bisect.insort_right(a, x, lo=0, hi=len(a)) 将x插入到列表a中,如果已有x,插入到所有x的最右边
bisect.insort(a, x, lo=0, hi=len(a)) 与insort_right相同
下面看个例子:
[python] view
plain copy
print?
>>> import bisect
>>> import random
>>> mylist = list()
>>> for i in range(10):
num = random.randint(1,100)
index = bisect.bisect_left(mylist, num)
bisect.insort_left(mylist, num)
print('num ', str(num), '\tindex ', str(index), '\tlist ', mylist)
num 37 index 0 list [37]
num 31 index 0 list [31, 37]
num 82 index 2 list [31, 37, 82]
num 27 index 0 list [27, 31, 37, 82]
num 62 index 3 list [27, 31, 37, 62, 82]
num 83 index 5 list [27, 31, 37, 62, 82, 83]
num 83 index 5 list [27, 31, 37, 62, 82, 83, 83]
num 87 index 7 list [27, 31, 37, 62, 82, 83, 83, 87]
num 98 index 8 list [27, 31, 37, 62, 82, 83, 83, 87, 98]
num 99 index 9 list [27, 31, 37, 62, 82, 83, 83, 87, 98, 99]
>>> mylist = list()
>>> for i in range(10):
num = random.randint(1,100)
index = bisect.bisect_right(mylist, num)
bisect.insort_right(mylist, num)
print('num ', str(num), '\tindex ', str(index), '\tlist ', mylist)
num 85 index 0 list [85]
num 73 index 0 list [73, 85]
num 82 index 1 list [73, 82, 85]
num 36 index 0 list [36, 73, 82, 85]
num 80 index 2 list [36, 73, 80, 82, 85]
num 4 index 0 list [4, 36, 73, 80, 82, 85]
num 79 index 3 list [4, 36, 73, 79, 80, 82, 85]
num 6 index 1 list [4, 6, 36, 73, 79, 80, 82, 85]
num 64 index 3 list [4, 6, 36, 64, 73, 79, 80, 82, 85]
num 25 index 2 list [4, 6, 25, 36, 64, 73, 79, 80, 82, 85]
>>> mylist = list()
>>> for i in range(10):
num = random.randint(1,100)
index = bisect.bisect(mylist, num)
bisect.insort(mylist, num)
print('num ', str(num), '\tindex ', str(index), '\tlist ', mylist)
num 25 index 0 list [25]
num 28 index 1 list [25, 28]
num 81 index 2 list [25, 28, 81]
num 9 index 0 list [9, 25, 28, 81]
num 29 index 3 list [9, 25, 28, 29, 81]
num 66 index 4 list [9, 25, 28, 29, 66, 81]
num 34 index 4 list [9, 25, 28, 29, 34, 66, 81]
num 60 index 5 list [9, 25, 28, 29, 34, 60, 66, 81]
num 61 index 6 list [9, 25, 28, 29, 34, 60, 61, 66, 81]
num 3 index 0 list [3, 9, 25, 28, 29, 34, 60, 61, 66, 81]
相关文章推荐
- 求助:python中深拷贝和浅拷贝的一道题目
- ubuntu无法打开software-center
- LeetCode Best Time to Buy and Sell Stock II
- Python random
- 据廖雪峰python3教程----python学习第十一天
- 使用Runtime.getRuntime().exec()在java中调用python脚本
- Python处理JSON
- Python3 print()函数sep,end,file参数用法练习
- LoadRunner使用odbc时报错can't get hostname for your address的解决方法
- 萌妹子Python入门指北(四)
- 萌妹子Python入门指北(三)
- python 学习--帮助信息
- python-MySQL学习笔记-第三章-利用Connector/Python来插入数据
- python入门
- [python]解决urllib.urlretrieve()下载不完全的问题
- python面向对象
- numpy.std() 计算矩阵标准差
- Python yield 使用浅析
- Python--将内容写入文本文件中
- numpy.mean() 计算矩阵均值