python питон Когда bisect_left и bisect_right не равны?




bisect питон (4)

bisect.bisect_left возвращает bisect.bisect_left левое место в отсортированном списке для вставки данного элемента. bisect.bisect_right возвращает bisect.bisect_right правое место в отсортированном списке для вставки данного элемента.

Альтернативный вопрос: когда они эквивалентны? Отвечая на это, ответ на ваш вопрос становится ясным.

Они эквивалентны, когда вставляемый элемент отсутствует в списке. Следовательно, они не эквивалентны, когда вставляемый элемент находится в списке.

В моем понимании bisect_left и bisect_right - это два разных способа сделать одно и то же: деление пополам, один слева и другой справа. Таким образом, из этого следует, что они имеют одинаковый результат. При каких обстоятельствах эти два не равны, то есть когда они будут возвращать разные результаты, предполагая, что список и значение, которое ищется, совпадают?


Как отмечали другие, bisect_left и bisect_right возвращают разные результаты, когда искомый элемент присутствует в списке.

Оказывается, что bisect_left более полезен, поскольку он возвращает точный индекс искомого элемента, если он присутствует в списке.

>>> import bisect
>>> bisect.bisect_left([1,2,3,4,5], 2)
1

Пример двоичного_поиска, который использует bisect_left:

from bisect import bisect_left

def binsearch(l,e):
    '''
    Looks up element e in a sorted list l and returns False if not found.
    '''
    index = bisect_left(l,e)
    if index ==len(l) or l[index] != e:
        return False
    return index

В приведенном выше коде будет небольшое изменение, если вы захотите использовать bisect_right вместо bisect_left и получите тот же результат.


Когда цель для поиска находится в списке, bisect_left , bisect_right возвращают другой результат.

Например:

>>> import bisect
>>> bisect.bisect_left([1,2,3], 2)
1
>>> bisect.bisect_right([1,2,3], 2)
2

Необходимо понимать две вещи: bisect.bisect и bisect.bisect_right работают одинаково. Они возвращают крайнюю правую позицию, в которую можно вставить элемент. Но, в отличие от вышесказанного, bisect.bisect_left возвращает bisect.bisect_left позицию, в которую можно вставить элемент. Используйте осторожно.





python-2.7