Python - 收集递归函数的输出

ale*_*ord 2 python recursion

我编写了一个旨在压平 json 的函数。该函数以递归方式工作 - 如果键、值对的值不是json,则返回键、值对,否则,对该值再次调用该函数:

def flatten_json(j):
    for k, v in j.items():
        if isinstance(v, dict):
            flatten_json(v)
        else:
            yield (k,v)

flat_json = {x[0]: x[1] for x in flatten_json(j)}
Run Code Online (Sandbox Code Playgroud)

这个想法是,每当函数yield出现元组时,它就会被收集到 flat_json 字典中。按照目前的情况,嵌套输出将被忽略 - 只有顶级键、值对出现在 flat_json 中。

Ada*_*Er8 5

这正是yield from:)的目的,通过从生成器内部调用生成器(无论是否是递归调用)来逐个生成元素。

尝试:

def flatten_json(j):
    for k, v in j.items():
        if isinstance(v, dict):
            yield from flatten_json(v)
        else:
            yield (k,v)


j = {'foo': 'bar', 'foo1': 'bar1', 'nest1': {'foo2': 'bar2'}}
flat_json = {x[0]: x[1] for x in flatten_json(j)}
print(flat_json)
Run Code Online (Sandbox Code Playgroud)

输出:

{'foo': 'bar', 'foo1': 'bar1', 'foo2': 'bar2'}
Run Code Online (Sandbox Code Playgroud)

此处运行示例: https: //ideone.com/Z5aO9V