Как объединить отсортированные потоки через heapq.merge в Python

Как объединить отсортированные потоки через heapq.merge в Python
Содержание статьи

Если каждый источник уже упорядочен по одному ключу, объедините их через heapq.merge. Функция возвращает итератор: записи можно читать по мере надобности. В практикуме Mentoring.digital разберём слияние двух учебных потоков событий.

Два источника и один ключ

В каждом кортеже первое значение обозначает условное время, второе служит подписью. Оба списка заранее отсортированы по времени.

from heapq import merge

left = [(1, "a"), (4, "b")]
right = [(2, "c"), (5, "d")]

events = merge(left, right, key=lambda row: row[0])
print(list(events))
# [(1, 'a'), (2, 'c'), (4, 'b'), (5, 'd')]

key извлекает значение для сравнения. В результате остаются сами кортежи со всеми полями. Вызов list здесь нужен только для показа небольшого примера.

Как читать результат постепенно

Для большого источника можно перебирать результат в цикле, а не превращать его в общий список. Это сохраняет смысл ленивого слияния. Но если исходные данные уже загружены в списки, память этих списков никуда не исчезает.

for event in merge(left, right, key=lambda row: row[0]):
    print(event)

Результат является итератором. После полного прохода он исчерпан. Чтобы пройти заново, создайте новое слияние и убедитесь, что сами входные источники тоже допускают повторное чтение.

Какие условия нельзя пропустить

merge предполагает, что каждый вход уже отсортирован по тому же ключу. Он не исправляет произвольный порядок внутри источника. Поэтому сначала проверьте контракт поставщика данных или отсортируйте конечные наборы отдельно.

При reverse=True все входы должны идти от большего к меньшему. Один обратный флаг не разворачивает неупорядоченные источники автоматически. Для самостоятельной проверки добавьте пустой источник, повторяющиеся ключи и два источника в обратном порядке.

Работу с коллекциями и итераторами можно освоить на курсах Python. Выбрать способ обработки своих данных поможет наставник по Python.

Похожие статьи по данной теме