все 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Сообщить о неточности