python - 如何在 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
就会丢失。我如何再次生成该字典?我得到的只是一个不是我想要的发电机。
解决方案
与您的递归调用一起使用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