Python數(shù)據(jù)結(jié)構(gòu)與算法—維護有序列表bisect
前言
bisect實現(xiàn)了一個算法來向列表中插入元素,同時仍保持列表有序。
本篇,將詳細介紹bisect庫高效率的玩轉(zhuǎn)列表。
有序插入
首先,我們來看看bisect庫是如何實現(xiàn)列表的插入的。具體代碼如下所示:
- import bisect
- a = [7, 5, 4, 1, 9, 8, 2, 3, 6, 0, 5]
- print(a)
- new_a = []
- for i in a:
- position = bisect.bisect(new_a, i)
- bisect.insort(new_a, i)
- print(position, new_a)
運行之后,效果如下:
可以看到,bisect會自動排序進行插入,position為插入的索引位置。當然,對于此類插入如果直接構(gòu)建列表,然后排序,可能速度更快。不過這只僅僅對于短列表而言非常的快,對于非常長的列表而言,使用上面這種插入排序方式可以大大節(jié)省時間和內(nèi)存,尤其是比較兩個列表成員的操作需要開銷很大的計算量時。
重復值處理
在實際的列表處理中,我們可能處理重復的值。如前文所示,多余的5是默認插入到重復值右邊的,也就是說相當于使用insort_right()函數(shù)。同理,那么左邊我們就可以用insort_left()函數(shù)。
- import bisect
- a = [7, 5, 4, 1, 9, 8, 2, 3, 6, 0, 5]
- print(a)
- new_a = []
- for i in a:
- position = bisect.bisect_left(new_a, i)
- bisect.insort_left(new_a, i)
- print(position, new_a)
運行之后,效果如下:
讀者可以對比一下上面兩個圖片,最后一行的索引變化。可以看到,一個是6,一個是5,因為我們主動變更,把重復值默認插入到左邊了。