我有一个包含很多值的字典,其中一些是子字典,也有子字典等等。
对于每个值,我需要构建一个字符串,将顶级键和一个点连接起来。因此,例如,如果我的字典是{'a': 1, 'b': {'c': 2, 'd': 3, 'e': {'f': 4}}}
,则需要构建以下字符串:
a
b.c
b.d
b.e.f
为此,我编写了以下代码
from types import GeneratorType
def get_parameter(d, top_level_param):
for k, v in d.items():
parameter = top_level_param + '.' + k
if isinstance(v, dict):
get_parameter(v, parameter)
else:
yield parameter
d = {'a': 1, 'b': {'c': 2, 'd': 3, 'e': {'f': 4}}}
for k, v in d.items():
if isinstance(v, dict):
parameter = get_parameter(v, k)
else:
parameter = k
if isinstance(parameter, GeneratorType):
for p in parameter:
print(p)
else:
print(parameter)
但是,输出缺少b.e.f
,我不知道为什么。在纸上,它应该应该由get_parameter()
返回。
答案 0 :(得分:4)
get_parameter
递归调用自身,但对结果不做任何事情。相反,您也想产生这些结果,您可以使用yield from
语句来完成该操作:
def get_parameter(d, top_level_param):
for k, v in d.items():
parameter = top_level_param + '.' + k
if isinstance(v, dict):
yield from get_parameter(v, parameter)
else:
yield parameter