Поиск списка в словаре словарей

Рейтинг: 1Ответов: 2Опубликовано: 24.04.2023

Есть словарь словарей с неизвестной вложенностью. Необходимо пройтись по всем словарям, найти где "спрятан" первый список и вытащить его для дальнейшей обработки. Как пример, есть словарь:

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'ы просто для наглядности что выводит функция.

Ответы

▲ 1

Результат рекурсии ведь надо возвращать

... 
if isinstance(value, dict):
     print('Здесь словарь:', value)
     t = find_list(value)
     if t:
         return t
▲ 1
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])