Вопрос по рекурсивному поиску по словарям 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 шт):
Ответ splash58 тоже в какой-то мере правильный (хотя нужно проверять разные случаи, возможно там нужно final.extend, а не просто присваивание), но всё же основная проблема в том, что вы неправильно проверяете параметр функции на равенство None. Правильная проверка:
if final is None:
final = []
А у вас получается, что если в функцию приходит пустой список, то if not final срабатывает и вы работаете дальше не с тем же пустым списком, а уже с новым. И поскольку вы при рекурсивном вызове возврат функции не сохраняете, то получается, что этот новый список, накопившийся при этом вызове, просто пропадает.
Если кому будет интересно - рабочая версия кода:
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'))