Python Glossary English

все Python 3bisectпонятие

Поиск по диапазонам через bisect()

применение

Идиома из документации bisect: bisect по списку границ даёт номер диапазона — табличный поиск за O(log n) вместо цепочки if/elif.

Синтаксис

i = bisect.bisect(breakpoints, x)  # номер диапазона
labels[i]                          # метка диапазона

Список меток должен быть ровно на один длиннее списка границ, иначе на крайних значениях вы получите IndexError или, что хуже, молча неверную метку. bisect() — это bisect_right, поэтому значение, точно равное границе, попадает в верхний диапазон; если граница должна принадлежать нижнему, берите bisect_left. И сами границы обязаны быть отсортированы по возрастанию — проверки нет.

Примеры

import bisect
breaks, letters = [60, 70, 80, 90], 'FDCBA'
print(letters[bisect.bisect(breaks, 33)])  # → 'F'
print(letters[bisect.bisect(breaks, 70)])  # → 'C' (граница уходит вверх)
print(letters[bisect.bisect(breaks, 89)])  # → 'B'
print(letters[bisect.bisect(breaks, 100)])  # → 'A'
print(letters[bisect.bisect_left(breaks, 70)])  # → 'D' (bisect_left оставляет границу внизу)

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности