Обратный индекс на Python: группировка уникальных значений через defaultdict
Напишите решение на Python и проверьте его на странице.
Другие упражнения по этой теме: Collections в Python: задачи на ChainMap, defaultdict и deque.
Обратный индекс вызовов
Сервисы в системе постоянно обращаются к внешним ресурсам: базам данных, очередям сообщений и кэшам. Журнал вызовов хранит пары «вызывающий сервис — целевой ресурс». Чтобы оценить зависимость системы от конкретных хранилищ, нужно составить обратную карту: для каждого ресурса собрать список всех сервисов, которые к нему обращаются.
Что уже дано
Готовый скрипт считывает входную строку JSON через sys.stdin.read(), вызывает функцию build_reverse_index и выводит результат в формате JSON в sys.stdout.
Что нужно сделать
Напишите тело функции build_reverse_index(calls: list[list[str]]) -> dict[str, list[str]].
Функция принимает список calls, элементами которого являются списки из двух строк вида [service_name, target_resource], где service_name — имя вызывающего сервиса, а target_resource — имя целевого ресурса.
Правила формирования результата:
- Ключами возвращаемого словаря должны стать все целевые ресурсы, упомянутые в
calls, и только они. - Значением для каждого ресурса должен быть список уникальных имён сервисов, обращавшихся к нему.
- Имена сервисов в списке для каждого ресурса должны быть отсортированы по возрастанию (лексикографически).
- Повторные обращения одного и того же сервиса к ресурсу не должны дублироваться в итоговом списке.
- Порядок пар во входных данных не должен влиять на состав и сортировку итогового списка сервисов.
- Если список
callsпуст, функция должна вернуть пустой словарь{}.
Ввод и вывод
Программа взаимодействует с окружением через стандартные потоки stdin и stdout.
Формат ввода
В стандартный ввод передаётся JSON-массив пар строк вида [[service, resource], ...]. Если передан пустой список, на вход поступает валидный JSON вида [].
Формат вывода
В стандартный вывод выводится одна JSON-строка со словарём вида {"resource": ["caller", ...], ...}, ключи которого упорядочены по возрастанию.
Пример
- Ввод
[["auth", "postgres-main"], ["orders", "postgres-main"], ["auth", "redis-cache"], ["orders", "kafka-events"], ["auth", "postgres-main"]]
- Вывод
{"kafka-events":["orders"],"postgres-main":["auth","orders"],"redis-cache":["auth"]}
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Удаление ключа из ChainMap в Python: проверка поведения del
- Подсчёт дефицита ресурсов в Python: квоты и суммы заявок
- ChainMap в Python: исправьте приоритет настроек и удаление переопределений
- Иерархия конфигурации в Python: изоляция настроек разных клиентов
- Скользящее окно Python: найдите кратчайшую подстроку с тремя символами
- Объединение команд и подсчёт рейтинга на Python
