Найти путь к элементу во вложенном словаре

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

Имеется вложенный словарь следующего вида:

{'a': {'s': {...}, 't': {...}}, 
 'b': {'q': {...}, 'y': {...}, 'k': {...}}, ['1', '2', '3'...], 
 'c': {'i': {{'p': [...], 'l': ['qw', 'rt']}}, 'm': {...}}}

Необходимо найти путь к определенному элементу.

Например, если требуется найти s = 'rt', то должно получиться ['c', 'i', 'l'].

Пыталась сделать такую реализацию, но пока ничего не работает:

def find_elements(my_dict, st):
    for k, v in my_dict.items():
        if isinstance(v, dict):
            for k2, v2 in v.items():
                if isinstance(v2, list) and st in v2:
                    yield k
                    yield k2
                else:
                    find_elements(v2, st)
        elif isinstance(v, list):
            for l in v:
                if l == st:
                    yield k
        elif isinstance(v, str):
            if v == st:
                yield k

s = 'какая-то строка'
qw = []
for i in find_elements(my_dict, s):
    qw.append(i)

Ответы

▲ 3Принят

Можно сделать рекурсивно, только нужно дополнительно сохранять уже пройденный путь, чтобы не потеряться.

def find_elements(my_dict, st, path=[]):
    for k, v in my_dict.items():
        if v == st or st in v:
            return path + [k]
        elif isinstance(v, dict):
            if el := find_elements(v, st, path + [k]):
                return el


my_dict = {'a': {'s': {}, 't': {}}, 'b': {'q': {}, 'y': {}, 'k': {'1'}},
           'c': {'i': {'p': [], 'l': 'rt'}, 'm': {}}}

s = 'rt'
qw = find_elements(my_dict, s)
print(qw)

Вывод:

['c', 'i', 'l']