← Все вопросы
Как вставить элемент в отсортированный список так, чтобы он остался отсортированным?
10
У меня есть список, который я держу отсортированным. Хочу добавлять новые элементы в правильную позицию. Делать insert по найденному вручную индексу или есть что-то готовое?
3 ответа
18
✓ Принятый ответ — помог автору
Для отсортированного списка есть модуль bisect — он находит позицию бинарным поиском за O(log n):
import bisect
lst = [1, 3, 5, 7]
bisect.insort(lst, 4)
print(lst) # [1, 3, 4, 5, 7]
insort сам найдёт место и вставит. Важно: сама вставка в список всё равно O(n) (надо сдвинуть хвост), но поиск позиции — логарифмический, что заметно быстрее линейного прохода. Если же список не отсортирован, bisect даст неверный результат — он рассчитан только на упорядоченные данные.
Лидия Гаврилова bisect.insort недооценён, многие пишут свой бинпоиск зря · 15 месяцев назад
4
Если позиция уже известна — обычный lst.insert(i, x). Но искать i линейным проходом по большому отсортированному списку — расточительно, для этого и есть bisect.
3
bisect.insort.
Ваш ответ
Войдите, чтобы ответить на вопрос.