首页 > 解决方案 > 如何在 Python 中生成递归函数

问题描述

所以我有一本字典:

{'a': {'b': {'c': 'd', 'e': 'f'}}}

我需要创建一个字典,如下所示:

{'c':'d', 'e','f'}

它可以更深入到任何级别,但我应该始终以最大深度获得键值对。所以我写了一个函数:

def boil_down_array(key, data):
    if type(data) == dict:
        for key, item in data.items():
            boil_down_array(key, item)
    else:
        yield {key:data}

现在的问题是,一旦它进入递归,yield就会丢失。我如何再次生成该字典?我得到的只是一个不是我想要的发电机。

标签: pythonpython-3.x

解决方案


与您的递归调用一起使用yield from,否则您只是忽略递归调用的结果:

def boil_down_array(key, data):
    if type(data) == dict:
        for key, item in data.items():
            yield from boil_down_array(key, item)
    else:
        yield {key: data}

这仅在 Python > 3.3 中可用,但本质上只是简单地从额外循环中产生的简写:

for key, item in data.items():
    for x in boil_down_array(key, item):  # just exhaust the recursive generator
        yield x  # and "re-yield" what it produces

为了实现您想要的数据结构,您最好生成对而不是dicts,因此您可以更轻松地将结果转换为结果dict

yield key, data

然后你可以像这样使用它:

result = dict(boil_down_array(None, input_dict))

一个更简单的递归方法只会返回一个完整的dict

def boil_down_nested(dct):
    result = {}
    for k, v in dct.items():
        if isinstance(v, dict):
            result.update(boil_down_nested(v))
        else:
            result[k] = v
    return result

推荐阅读