1. 程式人生 > >Python 模組學習——bisect

Python 模組學習——bisect

bisect是一個排序模組,操作物件必須為排好序的列表。

insort()函式:

在不影響排序的情況下插入元素。

bisect()函式:

找出在不影響排序的情況下元素應該插入的位置,但不會插入元素

可以看出6並沒有被插入列表d中

bisect_left 和 bisect_right 函式:

處理插入重複元素的情況,bisect_left()在列表中有與待插入元素重複的元素時,會返回將該元素插入到相同元素左邊的下標值,也就是該元素在列表中的位置;bisect_right()返回將該元素插入列表中相同元素後面的下標值,也就是該元素在列表中的位置+1.

可以看出在列表中沒有待插入元素時,正常插入即可;列表中有多個待插入元素時,返回的下標值為所有待插入元素之前(或之後)

insort_left  和 insort_right函式:

該操作會直接將元素插入所有與待插入元素相同的元素之前或之後。

看起來沒有什麼差別,但其實插入位置與bisect是對應的。

在leetcode上刷題時看到這個模組,才剛開始瞭解,所以把題也一起放上來。

參考別人的程式碼:

import bisect
class Solution(object):
    def findRadius(self, houses, heaters):
        """
        :type houses: List[int]
        :type heaters: List[int]
        :rtype: int
        """
        heaters.sort()
        r = 0
        for h in houses:
            ind = bisect.bisect_left(heaters, h)
            if ind == len(heaters):
                r = max(r, h - heaters[-1])
            elif ind == 0:
                r = max(r, heaters[0] - h)
            else:
                r = max(r, min(heaters[ind] - h, h - heaters[ind - 1]))
        return r