Извлечение ключей, связанных с вложенными словарями предыдущих уровней - PullRequest
0 голосов
/ 23 ноября 2018

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

{'furniture':{'chair':{'sofa':{'cushion':{}}}}}

В идеале мне нужна функция для определения пути к введенному мной значению.Я пытался исследовать онлайн, и это то, что я пытался ...

def route(d,key):
    if key in d: return d[key]

    for k,v in d.items():
        if isinstance(v,dict):
            item = route(v, key)
            if item is not None:
                return item

Это возвращает элементы внутри ключа.Я ищу возможность извлечь путь, который ведет к этому предмету.Например, route(dictionary,'sofa') тогда я смогу получить ожидаемый результат как таковой или что-то подобное ...

{'sofa':{'chair':'furniture'}}

Какими способами я могу достичь этого?Спасибо за вашу помощь

1 Ответ

0 голосов
/ 23 ноября 2018

Вы можете сделать это рекурсивно и вернуть список ключей, которые приведут вас к вашему целевому ключу:

def route(d, key):
    if key in d: return [key]
    for k, v in d.items():
        if type(v) == dict:
            found = route(v, key)
            if found: return [k] + found
    return []

Если мы запустим это в следующем словаре:

data = {
    'furniture': {
        'chair': {
            'sofa': {
                'cushion': {}
            }
        }
    },
    'electronics': {
        'tv': {
            'samsung43': 800,
            'tcl54': 200
        }
    }
}

print(route(data, 'cushion'))
print(route(data, 'tcl54'))
print(route(data, 'hello'))

мыполучить следующий вывод:

['furniture', 'chair', 'sofa', 'cushion']
['electronics', 'tv', 'tcl54']
[]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...