> **Источник:** https://python-all.ru/3.0/library/bisect.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `bisect` – алгоритм бисекции массива

Этот модуль позволяет поддерживать список в отсортированном виде без необходимости сортировать его после каждой вставки. Для длинных списков элементов с дорогостоящими операциями сравнения такой подход может быть эффективнее более распространённых. Модуль называется `bisect`, потому что использует простой алгоритм бисекции. Исходный код может быть особенно полезен как рабочий пример этого алгоритма (граничные условия уже корректны!).

Предоставляются следующие функции:

#### `[bisect.bisect_left]bisect.bisect_left(list, item[, lo[, hi]])`

Находит подходящую точку вставки для

*item*

в

*list*

, чтобы сохранить упорядоченность. Параметры

*lo*

и

*hi*

можно использовать для указания подмножества списка, которое следует рассматривать; по умолчанию используется весь список. Если

*item*

уже присутствует в

*list*

, точка вставки будет перед (левее) любых существующих записей. Возвращаемое значение подходит для использования в качестве первого параметра

`list.insert()`

. Предполагается, что

*list*

уже отсортирован.

#### `[bisect.bisect_right]bisect.bisect_right(list, item[, lo[, hi]])`

Похожа на

[`bisect_left()`](https://python-all.ru/3.0/library/bisect.html#bisect.bisect_left)

, но возвращает точку вставки, которая находится после (правее) любых существующих записей

*item*

в

*list*

.

#### `[bisect.bisect]bisect.bisect(...)`

Псевдоним

[`bisect_right()`](https://python-all.ru/3.0/library/bisect.html#bisect.bisect_right)

.

#### `[bisect.insort_left]bisect.insort_left(list, item[, lo[, hi]])`

Вставляет

*item*

в

*list*

в отсортированном порядке. Это эквивалентно

`list.insert(bisect.bisect_left(list, item, lo, hi), item)`

. Предполагается, что

*list*

уже отсортирован.

#### `[bisect.insort_right]bisect.insort_right(list, item[, lo[, hi]])`

Похожа на

[`insort_left()`](https://python-all.ru/3.0/library/bisect.html#bisect.insort_left)

, но вставляет

*item*

в

*list*

после любых существующих записей

*item*

.

#### `[bisect.insort]bisect.insort(...)`

Псевдоним

[`insort_right()`](https://python-all.ru/3.0/library/bisect.html#bisect.insort_right)

.

## Примеры

Функция [`bisect()`](https://python-all.ru/3.0/library/bisect.html#bisect.bisect) часто бывает полезна для категоризации числовых данных. В этом примере [`bisect()`](https://python-all.ru/3.0/library/bisect.html#bisect.bisect) используется для поиска буквенной оценки за экзамен (скажем) на основе набора упорядоченных числовых границ: 85 и выше – ‘A’, 75–84 – ‘B’ и т. д.

```python
>>> grades = "FEDCBA"
>>> breakpoints = [30, 44, 66, 75, 85]
>>> from bisect import bisect
>>> def grade(total):
...           return grades[bisect(breakpoints, total)]
...
>>> grade(66)
'C'
>>> map(grade, [33, 99, 77, 44, 12, 88])
['E', 'A', 'B', 'D', 'F', 'A']
```
