作者:杀手也热血_949 | 来源:互联网 | 2022-12-02 17:21
所以我有一本字典:
{'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
就会丢失.如何再次出示该词典?我得到的只是一台不是我想要的发电机.
1> schwobaseggl..:
使用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