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]

  

 

posted @ 2020-03-24 13:46  King~~~  阅读(151)  评论(0编辑  收藏  举报