bisect--------维护有序列表
作用:维护有序列表,而不必再每次向列表,而不必在每次向列表增加一个元素是都调用sort排序。
bisect模块实现了一个算法用于向列表中插入元素,同时仍保持列表有序。有些情况下,这笔反复对一个列表排序更高效,另外也比构建一个大列表之后再显示对其排序更为高效。
1.有序插入
import bisect import random random.seed(1) print('New Pos Contents') print('--- --- --------') a = [1,4,6,8,12,15,20] position = bisect.bisect(a,13) print(position) # 用可变序列内置的insert方法插入 a.insert(position,13) print(a) a = [1,4,6,8,12,15,20] bisect.insort(a,13) print(a)
2.处理重复
之前显示的结果包括一个重复的值77,bisect模块提供了两种方法来处理重复。新值可以插入到现在值的左边或右边。insort()函数实际是insort_right()的别名,这个函数会在现有值之后插入新值。相应的函数insort——left()则在现有值之前插入新值。
l = [] for i in range(1,15): r = random.randint(1, 100) position = bisect.bisect_left(l,r) bisect.insort_right(l,r) print('%3d %3d' %(r,position),l)
使用bisect_left()和insort_left()处理同样的数据是,结果会得到相同的有序列表,不过重复值插入的位置有所不同。
New Pos Contents --- --- -------- 41 0 [41] 3 0 [3, 41] 44 2 [3, 41, 44] 19 1 [3, 19, 41, 44] 32 2 [3, 19, 32, 41, 44] 16 1 [3, 16, 19, 32, 41, 44] 27 3 [3, 16, 19, 27, 32, 41, 44] 22 3 [3, 16, 19, 22, 27, 32, 41, 44] 84 8 [3, 16, 19, 22, 27, 32, 41, 44, 84] 37 6 [3, 16, 19, 22, 27, 32, 37, 41, 44, 84] 46 9 [3, 16, 19, 22, 27, 32, 37, 41, 44, 46, 84] 7 1 [3, 7, 16, 19, 22, 27, 32, 37, 41, 44, 46, 84] 84 11 [3, 7, 16, 19, 22, 27, 32, 37, 41, 44, 46, 84, 84] 78 11 [3, 7, 16, 19, 22, 27, 32, 37, 41, 44, 46, 78, 84, 84]
King@_@