python bisect使用,總結一下三條:
1. Python中的bisect用於操作排序的數組,比如你可以在向一個數組插入數據的同時進行排序。
2. 用來查找某值大於等於、小於等於、等於列表中元素位置下標。 解決牛牛找工作問題。
3. 實現查找,效率比較是:遞歸 < 二分查找 < bisect ,另外 numpy.searchsorted搜索numpy.ndarray類型的元素是很快。
代碼如下:
1.
import bisect
import random
random.seed(1)
ls= []
r = random.randint(1, 100)
position = bisect.bisect_left(ls, r) # 其目的在於查找該數值將會插入的位置並返回,而不會插入。
bisect.insort(ls, r) # 在ls相應位置插入值r,可以不先bisect,但是調用bisect的方法,前提是ls已經是有序的了,會改變ls內容
# --------------------------------------------------------------------------------------------------------------------------
2.在python中使用字典,元素是(難易程度,薪資),然後根據難易程度排序,修改第i個人薪資爲排序後前i個人最大薪資值;選取鍵中滿足find_le(a, x)的下標的值,就是某人已知難易程度,得到獲得的最大薪資值下標。根據下標就可以找到薪資了。完美的代替了java中的treemap
def index(a, x):
'Locate the leftmost value exactly equal to x'
i = bisect.bisect_left(a, x)
if i != len(a) and a[i] == x:
return i
raise ValueError
def find_lt(a, x):
'Find rightmost value less than x'
i = bisect.bisect_left(a, x)
if i:
return a[i-1]
raise ValueError
def find_le(a, x):
'Find rightmost value less than or equal to x'
i = bisect.bisect_right(a, x)
if i:
return a[i-1]
raise ValueError
def find_gt(a, x):
'Find leftmost value greater than x'
i = bisect.bisect_right(a, x)
if i != len(a):
return a[i]
raise ValueError
def find_ge(a, x):
'Find leftmost item greater than or equal to x'
i = bisect.bisect_left(a, x)
if i != len(a):
return a[i]
raise ValueError
# -----------------------------------------------------------------
# 我們可以用 bisect 模塊實現二分查找:
def binary_search_bisect(lst, x):
from bisect import bisect_left
i = bisect_left(lst, x)
if i != len(lst) and lst[i] == x:
return i
return None