大家好,对python bisect模块维护有序列表用法感兴趣的小伙伴,下面一起跟随三零脚本的小编来看看python bisect模块维护有序列表用法的例子吧。
bisect –维护有序列表
目的:不需要每次调用sort的方式维护有序列表。
bisect模块实现了一个算法用于插入元素到有序列表。在一些情况下,这比反复排序列表或构造一个大的列表再排序的效率更高。Bisect是二分法的意思,这里使用二分法来排序,bisect的源代码是二分法排序的样板。这个模块的代码不到100行。
插入
#三零脚本 www.q3060.com
import bisect
import random
# Use aconstant seed to ensure that
# the samepseudo-random numbers
# are usedeach time the loop is run.
random.seed(1)
print'New Pos Contents'
print'--- --- --------'
# Generaterandom numbers and
# insert theminto a list in sorted
# order.
l= []
for i inrange(1,15):
#产生1-100的随机数
r= random.randint(1,100)
position= bisect.bisect(l, r)
bisect.insort(l, r)
print'%3d %3d' % (r, position), l
执行结果:
Bisect模块提供的函数有:
查找在有序列表a中插入x的index。lo和hi用于指定列表的区间,默认是使用整个列表。如果x已经存在,在其左边插入。返回值为index。
这2个和bisect_left类似,但如果x已经存在,在其右边插入。
在有序列表a中插入x。和a.insert(bisect.bisect_left(a,x, lo, hi), x) 的效果相同。
和insort_left类似,但如果x已经存在,在其右边插入。
可以函数可以分2类,bisect*,用于查找index。Insort*用于实际插入。默认重复时从右边插入。实际常用的估计是insort。
标准中有个根据分数计算出评级的实例:
Bisect不像sort一样支持关键字参数,建议如下处理:
>>> data=[('red',5), ('blue',1), ('yellow',8), ('black',0)]
>>> data.sort(key=lambdar: r[1])
>>> keys=[r[1]for rin data] #precomputed list of keys
>>> data[bisect_left(keys,0)]
('black',0)
>>> data[bisect_left(keys,1)]
('blue',1)
>>> data[bisect_left(keys,5)]
('red',5)
>>> data[bisect_left(keys,8)]
('yellow',8)