Обратный индекс на 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"]}
РешениеPython

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

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

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