为什么这段代码没有遍历所有dict的元素?

时间:2018-11-08 10:42:05

标签: python python-3.x

我有一个包含很多值的字典,其中一些是子字典,也有子字典等等。

对于每个值,我需要构建一个字符串,将顶级键和一个点连接起来。因此,例如,如果我的字典是{'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()返回。

1 个答案:

答案 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