bisect 維護有序列表

2022-01-29 04:45:41 字數 1636 閱讀 5545

作用:維護有序列表,而不必再每次向列表,而不必在每次向列表增加乙個元素是都呼叫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]

Python標準庫 bisect 維護有序列表

python標準庫 bisect 維護有序列表 作用 維護有序列表,而不必在每次向列表增加乙個元素時都呼叫 sort 排序。python版本 1.4 及以後版本。bisect 模組實現了乙個演算法用於向列表中插入元素,同時仍保持列表有序。有些情況下,這比反覆對乙個列表排序更高效,另外也比構建乙個大列...

有序列表 無序列表 巢狀列表

無序列表 有序列表 coffee teamilk coffee teamilk 不同型別的有序列表 編號列表 bananas lemons oranges 大寫字母列表 bananas lemons oranges 小寫字母列表 bananas lemons oranges 羅馬數字列表 banan...

Python3 bisect是維護已排序序列神器

import bisect b 2,3,4,5 bisect.insort left b,2.0 bisect.insort right b,3.0 print bisect.bisect left b,2 print bisect.bisect right b,2 print b 列印結果 0 2...