1. bisect維護有序串列
bisect模塊實作了一個演算法來向串列中插入元素,同時仍保持串列有序,
1.1 有序插入
下面給出一個簡單的例子,這里使用insort()按有序順序向一個串列中插入元素,
import bisect # A series of random numbers values = [14, 85, 77, 26, 50, 45, 66, 79, 10, 3, 84, 77, 1] print('New Pos Contents') print('--- --- --------') l = [] for i in values: position = bisect.bisect(l, i) bisect.insort(l, i) print('{:3} {:3}'.format(i, position), l)
輸出的第一列顯示了新的亂數,第二輪顯示了這個數將插入到串列的哪個位置,每一行余下的部分則是當前的有序串列,

這是一個很簡單的例子,實際上,對于此例處理的資料量來說,如果直接構建串列然后完成一次排序,可能速度更快,不過對于長串列而言,使用類似這樣的一個插入排序演算法可以大大節省時間和記憶體,尤其是比較兩個串列成員的操作需要開銷很大的計算時,
1.2 處理重復
之前顯示的結果集包括一個重復的值77,bisect模塊提供了兩種方法來處理重復,新值可以插入到原值的左邊或右邊,insort()函式實際上是insort_right()的別名,這個函式會在原值之后插入新值,相應的insort_left()函式則在原值之前插入新值,
import bisect # A series of random numbers values = [14, 85, 77, 26, 50, 45, 66, 79, 10, 3, 84, 77, 1] print('New Pos Contents') print('--- --- --------') # Use bisect_left and insort_left. l = [] for i in values: position = bisect.bisect_left(l, i) bisect.insort_left(l, i) print('{:3} {:3}'.format(i, position), l)
使用bisect_left()和insort_left()處理同樣的資料時,結果是相同的有序串列,不過重復值插入的位置有所不同,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/189850.html
標籤:Python
