Поиск списка в словаре словарей
Есть словарь словарей с неизвестной вложенностью. Необходимо пройтись по всем словарям, найти где "спрятан" первый список и вытащить его для дальнейшей обработки. Как пример, есть словарь:
d = {'a': 1, 'b': 1, 'c': {'d': 1, 'e': {'f': {'c': 5, 'h': 5, 'k': 5}, 'd': 4, 'g': {'h': 1, 'f': 4, 'i': {'j': 1, 'k': [1,2,3,4,5], 'l': 7, 'm': {'n': 1, 'o': 1, 'p': [6,7,8]}}}}}}
Мне надо из этого словаря получить список [1,2,3,4,5].
Пытаюсь решить рекурсией, но не могу присвоить переменной необходимый мне список. Рекурсия не обязательна — просто не придумал как решать по-другому.
d = {'a': 1, 'b': 1, 'c': {'d': 1, 'e': {'f': {'c': 5, 'h': 5, 'k': 5}, 'd': 4, 'g': {'h': 1, 'f': 4, 'i': {'j': 1, 'k': [1,2,3,4,5], 'l': 7, 'm': {'n': 1, 'o': 1, 'p': [6,7,8]}}}}}}
def find_list(d: dict) -> list:
for value in d.values():
if isinstance(value, list):
print('Нашел список:', value)
return value
if isinstance(value, dict):
print('Здесь словарь:', value)
find_list(value)
res = find_list(d)
print(res)
Здесь в переменной res хотел бы получить свой список [1,2,3,4,5], но получаю None. Print'ы просто для наглядности что выводит функция.
Ответы (2 шт):
Автор решения: MBo
→ Ссылка
Результат рекурсии ведь надо возвращать
...
if isinstance(value, dict):
print('Здесь словарь:', value)
t = find_list(value)
if t:
return t
Автор решения: Namerek
→ Ссылка
from typing import Mapping, List
results: List[list] = []
def get_list(val):
if isinstance(val, Mapping):
for k, v in val.items():
val[k] = get_list(v)
elif isinstance(val, list):
results.append(val)
return list(map(get_list, val))
return val
get_list(src)
print(results[0])