python bisect模块维护有序列表的简单示例

对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧!

bisect –维护有序列表

目的:不需要每次调用sort的方式维护有序列表。

bisect模块实现了一个算法用于插入元素到有序列表。在一些情况下,这比反复排序列表或构造一个大的列表再排序的效率更高。bisect是二分法的意思,这里使用二分法来排序,bisect的源代码是二分法排序的样板。这个模块的代码不到100行。

插入


# @param python模块介绍- bisect模块维护有序列表
# @author 编程之家 jb51.cc|www.www.jb51.cc 

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

# End www.jb51.cc

 

执行结果:

#./bisect_example.py

New Pos Contents

--- --- --------

14 0[14]

85 1[14,85]

77 1[14,77,85]

26 1[14,26,85]

50 2[14,50,85]

45 2[14,45,85]

66 4[14,66,85]

79 6[14,79,85]

10 0[10,14,85]

3 0[3,10,85]

84 9[3,84,85]

44 4[3,44,85]

77 9[3,85]

1 0[1,3,85]

 

bisect模块提供的函数有:

bisect.bisect_left(a,x,lo=0,hi=len(a)) :

查找在有序列表a中插入x的index。lo和hi用于指定列表的区间,认是使用整个列表。如果x已经存在,在其左边插入。返回值为index。

bisect.bisect_right(a,hi=len(a))

bisect.bisect(a,hi=len(a))

这2个和bisect_left类似,但如果x已经存在,在其右边插入。

bisect.insort_left(a,hi=len(a))

在有序列表a中插入x。和a.insert(bisect.bisect_left(a,lo,hi),x) 的效果相同。

bisect.insort_right(a,hi=len(a))

bisect.insort(a,hi=len(a))

和insort_left类似,但如果x已经存在,在其右边插入。

可以函数可以分2类,bisect*,用于查找index。Insort*用于实际插入。认重复时从右边插入。实际常用的估计是insort。

标准中有个根据分数计算出评级的实例:

>>> def grade(score,breakpoints=[60,70,80,90],grades='FDCBA'):

... i = bisect(breakpoints,score)

... return grades[i]

...

>>> [grade(score)for score in [33,99,89,90,100]]

['F','A','C','B','A']

bisect不像sort一样支持关键字参数,建议如下处理:


# @param python模块介绍- bisect模块维护有序列表
# @author 编程之家 jb51.cc|www.www.jb51.cc 

>>> data =[('red',5),('blue',1),('yellow',8),('black',0)]
>>> data.sort(key=lambdar: r[1])
>>> keys =[r[1] for r in 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)

# End www.jb51.cc

相关文章

在前一篇博客中我们介绍了加侧旋的乒乓球弧圈技术的模拟,本...
在近期conda的版本更新中,有可能会删除路径下的_sysconfigd...
本文主要展示了一些lambda表达式的使用示例,通过这些示例,...
本文通过对比Jax和Numpy计算Normalized Hamming Distance的过...
我们知道GPU加速在可并行化程度比较高的算法中,能够发挥出比...
Numpy这个库在Python编程中非常的常用,不仅在性能上补足了P...