python - 检索嵌套字典的所有键(任意长度和深度),其中键名指示字典中的位置
问题描述
假设我有以下字典:
{
'a1': {'b1': {'c1': 'val'}, 'b2': { 'c2': { 'd2': 'terminal'} } },
'a2': {'b2': 'val'}
}
我的目标是检索列表中的所有键:
'a1', 'b1', 'c1', 'b2', 'c2', 'd2', 'a2', 'b2'
但随后也保留它们在字典中的位置,如下所示:
'a1', 'a1.b1', 'a1.b1.c1', 'a1.b2', 'a1.b2.c2', 'a1.b2.c2.d2', 'a2', 'a2.b2'
这在Python中可能吗
解决方案
一种方法是使用递归生成器函数:
data = {
'a1': {'b1': {'c1': 'val'}, 'b2': {'c2': {'d2': 'terminal'}}},
'a2': {'b2': 'val'}
}
def nested_iter(d, root=""):
for key, value in d.items():
printable = f"{root}.{key}" if root else key
if isinstance(value, dict):
yield printable
yield from nested_iter(value, root=printable)
else:
yield printable
print(list(nested_iter(data)))
输出
['a1', 'a1.b1', 'a1.b1.c1', 'a1.b2', 'a1.b2.c2', 'a1.b2.c2.d2', 'a2', 'a2.b2']
作为替代方案,您可以使用它collections.deque
来处理递归:
def nested_iter_with_deque(d):
from collections import deque
result = []
q = deque(d.items())
while q:
k, vs = q.popleft()
result.append(k)
if isinstance(vs, dict):
lst = [(f"{k}.{key}", value) for key, value in vs.items()]
if lst:
q.extendleft(deque(lst))
return result
print(nested_iter_with_deque(data))
输出
['a1', 'a1.b2', 'a1.b2.c2', 'a1.b2.c2.d2', 'a1.b1', 'a1.b1.c1', 'a2', 'a2.b2']
推荐阅读
- javascript - 模块对象返回 null
- swagger-ui - 使用 fastify 在 REST API 中添加文档
- spring-boot - 使用托管在 Cloud Foundry 上的 Nginx 服务器运行的静态 Web 的 Spring Boot SideCar 应用程序
- java - 存储函数式接口定义并通过 lambdas 定义的对象叫什么?
- c++ - 如何使用 WIN32 C/C++ API 告诉 Windows 10 平铺、居中或拉伸桌面壁纸?
- powerbi - 如何使用 IF 在 Power BI 中创建度量?
- splunk - 从 splunk 中提取数据
- flutter - Flutter:在 list.generate 中制作列表项
- python - 破折号:输出('text2','children')类型错误:'输出'对象不可下标
- javascript - 如何基于prop在文件中动态导入react组件