Цикл по вложенным словарям и спискам

пытаюсь сделать текстовый квест примерно из вот такого кода:

{"Location_1": ["Enemy10", {"Location_2": ["Enemy15",{"Location_10": [{"Exit": "Win"}]}]}]}

По факту словарь больше и более разветвлен, находится в отдельном json файле. Реализация должна заключаться в том, что нужно выбирать локации(ключ словаря), заходить в них, внутри будут враги, последние числа названий которых нужно суммировать, и также другие локации. Подскажите, какая конструкция должна быть у цикла по таким разветвлениям. Допустим, с помощью цикла фор попадаю в значения первой локации, и как далее реализовывать выбор элементов и последующие проходы в локации не соображу Более подробные правила:

На прохождение дается 100000 секунд. Цель - за отведенное время найти выход

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

Чтобы открыть выход и выбраться, нужно иметь не менее 300 очков опыта. Если до открытия время заканчивается - гг умирает, а игра начинается заново. Карта это json-файл. Локации в лабиринте описывается объектами, в которых находится единственный ключ с названием, соответствующем формату "Location_nm_tm", где N - номер локации, а T - это время, которое необходимо для перехода. Например, если игрок заходит в локацию "Location_8_1000", то он тратит на это 1000 секунд. По ключу находится список, содержащий строки с врагами а также другие локации. Описание врага представляет собой строку в формате "enemy_ex_tm", где K - количество опыта, которое получает игрок, уничтожив врага, а M - это время, которое потратит игрок для уничтожения врага. Например, уничтожив монстра "Boss_exp10_tm20", игрок потратит 20 секунд и получит 10 единиц опыта. Нужный путь только один. При каждом ходе игрока скрипт должен запоминать в csv файл следующую информацию:

  • текущую локацию
  • текущий опыт
  • текущие дату и время

Ответы (1 шт):

Автор решения: Zhihar

Я только для удобства разделил цифры и названия, чтобы удобно было вычленять, но алгоритм можно любой сделать, например просто отрезать Enemy (если он присутствует в слове)

data = {"Location_1": ["Enemy_10", {"Location_2": ["Enemy_15",{"Location_10": [{"Exit": "Win"}]}]}]}


def analyze_object(object):
    count = 0

    # если объект - словарь, то проанализировать все значения словаря по ключу
    if isinstance(object, dict):
        for key in object:
            count += analyze_object(object[key])

    # если объект - список, то проанализировать все элементы списка
    if isinstance(object, list):
        for element in object:
            count += analyze_object(element)

    # если объект - строка, то вычленить числа
    if isinstance(object, str):
        word = object.split('_')
        if len(word) == 2:
            count += int(word[1])

    return count


print(analyze_object(data))
→ Ссылка