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')]
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Как groupby группирует несортированные данные: тест itertools Python
- Itertools на Python: ленивый перебор комбинаций параметров
- Itertools на Python: разбейте поток на партии с лимитом
- Itertools на Python: объедините генераторы в непрерывный поток
- Скользящие окна Python: генерация кортежей без загрузки всего потока
- Итераторы Python: сборка кадра из двух потоков без лишнего чтения
