Python標準庫 bisect 維護有序列表

2021-07-09 03:38:18 字數 1765 閱讀 4878

[python標準庫]bisect——維護有序列表

作用:維護有序列表,而不必在每次向列表增加乙個元素時都呼叫 sort 排序。

python版本:1.4 及以後版本。

bisect 模組實現了乙個演算法用於向列表中插入元素,同時仍保持列表有序。有些情況下,這比反覆對乙個列表排序更高效,另外也比構建乙個大列表之後再顯示地對其排序更為高效。

有序插入

下面給出乙個簡單的例子,這裡使用 insort() 按有序順序向乙個列表中插入元素。

import bisect

import random

# use a constant seed to ensure that

# the same pseudo-random numbers

# are used each time the loop is run.

random.seed(1)

print 'new pos contents'

print '--- --- --------'

# generate random numbers and

# insert them into a list in sorted

# order.

l =

for i in range(1, 15):

r = random.randint(1, 100)

position = bisect.bisect(l, r)

bisect.insort(l, r)

print '%3d %3d' % (r, position), l

輸出的第一列顯示了新隨機數,第二列顯示了這個數將插入到列表的哪個位置。每一行餘下的部分則是當前的有序列表。

這是乙個簡單的例子,對於此例所處理的資料量來說,如果直接構建列表然後完成一次排序可能速度更快。不過對於長列表而言,使用類似這樣的乙個插入排序演算法可以大大節省時間和記憶體。

處理重複

之前顯示的結果包含了乙個重複的值 77。bisect 模組提供了兩種方法來處理重複。新值可以插入到現有值得左邊或右邊。insort() 函式實際上是 insort_right() 的別名,這個函式會在現有值之後插入新值。相應的函式 insort_left() 則在現有值之前插入新值。

import bisect

import random

# reset the seed

random.seed(1)

print 'new pos contents'

print '--- --- --------'

# use bisect_left and insort_left

l =

for i in range(1, 15):

r = random.randint(1, 100)

position = bisect.bisect_left(l, r)

bisect.insort_left(l, r)

print '%3d %3d' % (r, position), l

使用 bisect_left() 和 insort_left() 處理同樣的資料時,結果會得到相同的有序列表,不過重複值插入的位置有所不同。

處理 python 實現外,還有乙個速度更快的 c 實現。如果有 c 版本,匯入 bisect 時,這個實現會自動地覆蓋純 python 實現。

Python排序模組 bisect

bisect是python內建模組,主要用於有序序列的插入與查詢!使用這個模組的函式前先確保操作的列表是已排序的 模組的結構 import bisect print dir bisect 結果 builtins cached doc file loader name package spec bis...

python排序模組 bisect

import bisect data 2,4,7,9 使用該模組時需確保操作的列表是已排序的 bisect.insort list,boj 在有序列表中插入元素,不影響原有的排序,插入後的列表仍是有序的 bisect.insort data,3 print data data 2,3,4,7,9 使...

python學習 bisect模組

1.bisect模組為內建標準庫,它實現了二分法查詢演算法 只要提到二分法查詢,應該優先想到此模組 2.主要包含有兩個函式 bisect函式 查詢元素 和insort函式 插入元素 場景1 已知乙個有序列表,查詢目標元素的位置索引 import bisect 已知乙個有序序列 ordered lis...