在Python字典中记录键路径的递归函数

在Python字典中记录键路径的递归函数,python,python-2.7,dictionary,recursion,Python,Python 2.7,Dictionary,Recursion,下午好 我希望有人能帮助我定义这个函数,我已经看过了类似的问题,但不幸的是我仍然不清楚 我的目标是递归地遍历嵌套字典并记录到达每个最终键所需的键路径 例如,如果我有这个dic: example_dic = { "fruitType": 'apple', "orderNumber": 12345, "links": { "self": { &quo

下午好

我希望有人能帮助我定义这个函数,我已经看过了类似的问题,但不幸的是我仍然不清楚

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

例如,如果我有这个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的知识(以及一般的编程),所以可能我缺少了一个关于递归的基本元素


非常感谢所有能帮忙的人

您可以使其成为递归生成器。遍历字典中的键和值,并递归字典中的值。只需为不是字典的值生成键

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

“我仍然在学习很多关于Python的知识(以及一般的编程)”——这使得您选择使用Python2很奇怪。除了维护遗留代码之外,在2021年使用Python2没有什么好的理由。如果您仍在学习Python,为什么不学习仍在积极维护的类型?@JohnColeman,谢谢!我很欣赏这个建议,事实上我同意Python 2现在并不理想,但我必须处理它,因为我的工作仍然有很多与之相关的东西,还没有转换。然而,3实际上是我将要关注的。这完全做到了!非常感谢你,阿兰。