@Rild2

Почему цикл в рекурсии перебирает один и тот же объект?

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

Здесь я хочу найти значение 14, которое находится под ключом 'e'.

Для этого я написал рекурсию, которая просматривает словарь на предмет нужного мне ключа (name). Если в словаре такого ключа нет, то запускается цикл для каждого словаря внутри исходного, в котором опять запускается рекурсия. И так до победного.

Но почему-то цикл в рекурсии, после того как начался поиск в словаре 'b', за i значения в 'b' не принимает. Он до бесконечности прокручивает 'b', и в следующую рекурсию тоже подаётся 'b', после чего возникает ошибка, как видно на этой картинке:
6263c17a670b8309662195.png
Почему так происходит?
Код ниже:
D = {'b': {1: 4, 2: 5, 'c': 6}, 2: {'e': 14, 'qq': 15}}

def d_find(name, d):
    if name not in d:
        for i in d:
            return d_find(name, i)
    else:
        return d[name]

print(d_find('e', D))
  • Вопрос задан
  • 109 просмотров
Решения вопроса 1
@twistfire92
Python backend developer
Основная проблема в том, что d_find принимает на вход имя ключа в виде строки и словарь в котором надо найти этот ключ.
На первом же витке рекурсии вы передаете в функцию имя ключа по которому нужно найти значение и ИМЯ ТЕКУЩЕГО КЛЮЧА, который тоже представляет собой строку.
Строки в питоне - итерируемые объекты. Вы начинаете итерироваться по строке 'b' и тем самым уходите в бесконечные дебри.

def d_find(name, d):
    if name in d.keys():
        return d[name]
    else:
        for key, value in d.items():
            if isinstance(value, dict):
                if result := d_find(name, value):
                    return result
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы