← Все вопросы

Как вставить элемент в отсортированный список так, чтобы он остался отсортированным?

Задан 16 месяцев назад361 просмотров3 ответа
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.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект