Вопрос по рекурсивному поиску по словарям python

Всем привет!

Новичок в питоне, сломал всю голову, не могу понять где ошибка.. Есть задача сделать рекурсивный поиск по словарю и добавлять ключи в которых встречается искомое значение в лист, выдавать лист в качестве результата работы функции.

Код:

x = {1:2, 2:3, 3:4, 5:33, 'kek': 3, 11: {22: 3, 55: 'ZZZ', '333': {3333: {'444': 44}}}} # словарь по которому осуществляем поиск

def reqursive(lst,fnd, final = None): #lst - словарь по которому осуществляем поиск, fnd - значение, которое ищем, filal - итоговый список с результатами работы скрипта, по умолчанию None
    if not final: final = [] #При первом запуске скрипта создается пустой список, в дальнейшем наполняется значениями
    for key, value in lst.items():
        if not isinstance(value, dict): #Проверяем тип значения, если это не словарь и значение соответствует искомому - добавляем в список
            if fnd == value:
                final.append(key)
        else: # Если словарь - рекурсим
            reqursive(value,fnd, final)
    return final

print(reqursive(x, fnd=3))

Проблема:

Если запускаем функцию с fnd = 3 - все работает корректно, но если fnd = 'ZZZ' то возвращается пустой список, хотя значение явно есть!

x = {1:2, 2:3, 3:4, 5:33, 'kek': 3, 11: {22: 3, 55: 'ZZZ', '333': {3333: {'444': 44}}}} # словарь по которому осуществляем поиск

def reqursive(lst,fnd, final = None): #lst - словарь по которому осуществляем поиск, fnd - значение, которое ищем, filal - итоговый список с результатами работы скрипта, по умолчанию None
    if not final: final = [] #При первом запуске скрипта создается пустой список, в дальнейшем наполняется значениями
    for key, value in lst.items():
        if not isinstance(value, dict): #Проверяем тип значения, если это не словарь и значение соответствует искомому - добавляем в список
            if fnd == value:
                final.append(key)
                print(final)
        else: # Если словарь - рекурсим
            reqursive(value,fnd, final)
    return final

print(reqursive(x, fnd='ZZZ'))

В чем может быть проблема?


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

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

Ответ splash58 тоже в какой-то мере правильный (хотя нужно проверять разные случаи, возможно там нужно final.extend, а не просто присваивание), но всё же основная проблема в том, что вы неправильно проверяете параметр функции на равенство None. Правильная проверка:

if final is None:
    final = []

А у вас получается, что если в функцию приходит пустой список, то if not final срабатывает и вы работаете дальше не с тем же пустым списком, а уже с новым. И поскольку вы при рекурсивном вызове возврат функции не сохраняете, то получается, что этот новый список, накопившийся при этом вызове, просто пропадает.

→ Ссылка
Автор решения: Good Jobs

Если кому будет интересно - рабочая версия кода:

x = {1:2, 2:3, 3:4, 5:33, 'kek': 3, 11: {22: 3, 55: 'ZZZ', '333': {3333: {'444': 44}}},1:2, 2:3, 3:4, 5:33, 'kek': 3, 1234: 'ZZZ', 1222:{11111: 2222 ,2222:'ZZZ', 'sdfsd': {555555:'ZZZ', 44:{909: {123:{44: 'ZZZ'}}}}}, 'QWERTYT': 'ZZZ'}

def reqursive(lst,fnd, final = None): #lst - словарь по которому осуществляем поиск, fnd - значение, которое ищем, filal - итоговый список с результатами работы скрипта, по умолчанию None
    if final is None: final = [] #При первом запуске скрипта создается пустой список, в дальнейшем наполняется значениями
    for key, value in lst.items():
        if not isinstance(value, dict): #Проверяем тип значения, если это не словарь и значение соответствует искомому - добавляем в список
            if fnd == value:
                final.append(key)
        else: # Если словарь - рекурсим
            reqursive(value,fnd, final)
    return final

print(reqursive(x, fnd='ZZZ'))
→ Ссылка