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相同
下面看个例子:
- >>> 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]