Groupby на Python: сводка последовательных серий событий

Напишите решение на Python и проверьте его на странице.

Другие упражнения по этой теме: Itertools в Python: задачи на комбинации, groupby и ленивые потоки.

Сводка серий сообщений

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

Однако попытка отложить разбор генераторов групп «на потом» приводит к ошибке: из-за общего курсора потока списки событий оказываются пустыми, а данные серии теряются.

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

Что уже дано

В редакторе представлена функция summarize_runs(records), в которой ошибочная попытка заранее собрать список групп groupby приводит к опустошению данных. Вспомогательная функция make_log_records доступна при выполнении для создания тестовых итераторов.

Что нужно сделать

Исправьте функцию summarize_runs(records).

Функция принимает records — одноразовый итератор кортежей вида (node, message), упорядоченных по времени (от 0 до 1000 записей; длина имени узла от 1 до 30 символов, длина сообщения от 0 до 100 символов).

Функция должна вернуть список кортежей вида (node, count, first_message), по одному кортежу на каждую серию подряд идущих сообщений от одного узла:

  • node (str) — имя узла;
  • count (int) — точное количество записей в этой серии;
  • first_message (str) — текст сообщения из самой первой записи данной серии (включая пустую строку, если она была сообщением).

Правила формирования сводки:

  • Каждая запись из records должна быть учтена в своей серии ровно один раз.
  • Исходный порядок следования серий должен строго сохраняться без сортировки или перестановки записей.
  • Если один и тот же узел встречается в потоке повторно после записей других узлов, каждая такая цепочка образует самостоятельную серию.
  • Если входной поток пуст, функция должна вернуть пустой список [].
  • Разрешается сохранять записи текущей обрабатываемой группы в памяти (например, через список), но нельзя откладывать вычитывание подгрупп на потом.

Ввод и вывод

Потоки stdin и stdout не используются: считывать ввод и выводить данные через print() не нужно. Проверяющая система после выполнения кода ученика получает из глобальной области видимости функцию верхнего уровня summarize_runs и вызывает её напрямую.

Пример использования

records = make_log_records([('A', 'first'), ('A', 'second'), ('B', 'ping'), ('A', 'again')])
print(summarize_runs(records))

Вывод:

[('A', 2, 'first'), ('B', 1, 'ping'), ('A', 1, 'again')]
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи