標準庫 bisect
本文簡單介紹
bisect
庫的一些使用方法。
簡介
- 用來處理已排序的序列。
- 用來維持已排序的序列(升序)
- 二分查找。
以排序方式插入
bisect
模塊裏實現了一個向列表插入元素時也會順便排序的算法。(升序)
import bisect
inter_list = []
# 插入一些隨機數
bisect.insort(inter_list, 3)
bisect.insort(inter_list, 2)
bisect.insort(inter_list, 5)
bisect.insort(inter_list, 1)
bisect.insort(inter_list, 6)
print(inter_list)
輸出結果:
[1, 2, 3, 5, 6]
查找插入數據位置
- 查找我們將要插入序列的位置
import bisect
inter_list = []
# 插入一些隨機數
bisect.insort(inter_list, 3)
bisect.insort(inter_list, 2)
bisect.insort(inter_list, 5)
bisect.insort(inter_list, 1)
bisect.insort(inter_list, 6)
print(inter_list)
print(bisect.bisect(inter_list, 5))
輸出結果:
[1, 2, 3, 5, 6]
4
對重複的數據的處理
- 對於重複的值,
bisect
模塊提供了兩種方法來進行處理: - 可以選擇將新值插到舊值的左邊,也可以插到右邊。
insort()
函數實際上是insort_right()
函數,這個函數會將新值插到舊值的右邊。- 與它相當的函數
insort_left()
則是將值插到舊值的左邊。
import bisect
# 一些隨機數
values = [14, 85, 77, 26, 50, 45, 66, 79, 10, 3, 84, 77, 1]
print('New Pos Contents')
print('--- --- --------')
# 使用 bisect_left 和 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)
輸出結果:
New Pos Contents
--- --- --------
14 0 [14]
85 1 [14, 85]
77 1 [14, 77, 85]
26 1 [14, 26, 77, 85]
50 2 [14, 26, 50, 77, 85]
45 2 [14, 26, 45, 50, 77, 85]
66 4 [14, 26, 45, 50, 66, 77, 85]
79 6 [14, 26, 45, 50, 66, 77, 79, 85]
10 0 [10, 14, 26, 45, 50, 66, 77, 79, 85]
3 0 [3, 10, 14, 26, 45, 50, 66, 77, 79, 85]
84 9 [3, 10, 14, 26, 45, 50, 66, 77, 79, 84, 85]
77 7 [3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85]
1 0 [1, 3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85]
同樣的數據使用 bisect_left()
和 insort_left()
操作後結果並不會有什麼不同,只是遇到相同的值時,插入的位置不一樣。
最後
- insort_right(a, x, lo=0, hi=None)
- bisect_right(a, x, lo=0, hi=None)
- insort_left(a, x, lo=0, hi=None)
- bisect_left(a, x, lo=0, hi=None)
bisect
的方法有以上幾個,具體的使用方法可閱讀 bisect
的源碼。
裏面有詳細的介紹,本文中我們只簡單幾個舉例。
Ref:標準庫實例