python - 在 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(和一般编程)的知识,所以也许我缺少一个关于递归的基本元素。
非常感谢任何可以提供帮助的人!
解决方案
你可以让它成为一个递归生成器。遍历字典的键和值,并递归查找作为字典的值。只为不是字典的值生成键。
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 - 您如何将一列系列转换为带有标题的单行系列?
- java - javax.annotation 类和 Java 11 JDK
- javascript - 应该如何将数据推送到数组中过滤对象的一部分?
- python - 悖论:导入时 Python 的 ctypes.CDLL 发生静默崩溃,但直接运行时不会崩溃 - 这怎么可能?
- python - 类装饰器上的 Mypy 注释
- java - 关于声明和初始化的问题
- c# - 如何在 ASP.NET WebAPI 中返回文件
- postgresql - 从查询到 c.JSON 非常慢
- excel - 如何使用宏加密文件
- android - 我在哪里可以找到 CMake 的 `Android Gradle` 生成器的源代码?