【问题标题】:Recursive Function to Record Key path in a Python Dictionary在 Python 字典中记录键路径的递归函数
【发布时间】:2021-05-26 02:48:52
【问题描述】:

下午好。

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

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

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

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

【问题讨论】:

  • “我还在学习很多关于 Python(和一般编程)的知识”——这让你选择使用 Python 2 很奇怪。除了维护遗留代码之外,在 2021 年使用 Python 2 的理由很少。如果您仍在学习 Python,为什么不学习仍在积极维护的类型?
  • @JohnColeman,谢谢!我很欣赏这个建议,确实我同意 Python 2 现在并不理想,但我必须处理它,因为我的工作仍然有很多与之相关的东西尚未过渡。但是,实际上我将重点关注 3。

标签: python python-2.7 dictionary recursion


【解决方案1】:

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

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

【讨论】:

  • 这完全做到了!非常感谢阿兰。
猜你喜欢
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 2021-12-04
  • 2014-01-08
相关资源
最近更新 更多