Python 3 標準庫 bisect — 維護已排序列表

標準庫 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:標準庫實例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章