首页 > 解决方案 > 在 Python 字典中记录键路径的递归函数

问题描述

下午好。

我希望有人可以帮助我解决我正在尝试定义的功能,我查看了已经提出的类似问题,但不幸的是,我仍然不清楚。

我的目标是递归地遍历嵌套字典并记录到达每个最终键所需的键路径。

因此,例如,如果我有这个 dic:

    example_dic = {
    "fruitType": 'apple',
    "orderNumber": 12345,
    "links": {
        "self": {
            "href": 'https://foo'
        }
    },
    "customerName": 'bob'
}

所需的输出(现在我只是打印)将类似于

fruitType
orderNumber
links self href
customerName

这是我到目前为止所取得的成就:

def get_key_path(to_find_keys, key_path):

for key in to_find_keys.keys():

    print key

    key_path.append(key) # Append to list
    try:
        get_key_path(to_find_keys[key], key_path) # About to call function recursively 

    except AttributeError:

        print key_path # Found last key, print it.
        key_path = []  # Reset list

现在它确实成功地找到了 dic 中的每个最后一个键,但我在重置列表时遇到了麻烦。如果我的 dic 有很多条目和嵌套,则列表会在错误的时刻重置。

我仍然在学习很多关于 Python(和一般编程)的知识,所以也许我缺少一个关于递归的基本元素。

非常感谢任何可以提供帮助的人!

标签: pythonpython-2.7dictionaryrecursion

解决方案


你可以让它成为一个递归生成器。遍历字典的键和值,并递归查找作为字典的值。只为不是字典的值生成键。

def keyPaths(d):
    for k,sd in d.items():
        if isinstance(sd,dict):
            yield from (f"{k} {sub}" for sub in keyPaths(sd))
        else:
            yield k

输出:

example_dic = {
    "fruitType": 'apple',
    "orderNumber": 12345,
    "links": {
        "self": {
            "href": 'https://foo'
        }
    },
    "customerName": 'bob'
}

for path in keyPaths(example_dic):
    print(path)

fruitType
orderNumber
links self href
customerName

推荐阅读