使用yield压平嵌套字典有多简单?
发布时间:2025-04-06 15:45:20

我们经常遇到各种字典套字典的数据,比如:
nest_dict={
'a':1,
'b':{
'c':2,
'd':3,
'e':{'f':4}
},
'g':{'h':5},
'i':6,
'j':{'k':{'l':{'m':8}}}
}有没有简单的方法把它压扁,变成:
{
'a':1,
'b_c':2,
'b_d':3,
'b_e_f':4,
'g_h':5,
'i':6,
'j_k_l_m':8
}Python视频教程推荐学习
你一定想过用递归来解决这个问题,所以你可以试试,看看你的递归函数有多少行代码。
今天,我们使用yield关键字来满足这一需求。我们只需要8行代码,而不需要炫耀我们的技能。在炫耀技能的情况下,只需要3行代码。
为了快速压扁这个嵌套字典,我们需要从下网处理字段。例如,B->e->f->在这条路径上,我们首先把{'放在最里面;f': 4}转换为一个元组(');f', 4)。然后,向上抛出元组,得到元组('e', ('f', 4)。我们把 e拼接到f的前面,变成:('e_f', 4)继续向上抛出,得到('b', ('e_f', 4)。然后将b拼接到e_f上,得到('b_e_f', 4)。组装一条线路。
如果用yield关键词来实现这个逻辑,那就是:
defflat(x):
forkey,valueinx.items():
ifisinstance(value,dict):
fork,vinflat(value):
k=f'{key}_{k}'
yield(k,v)
else:
yield(key,value)运行结果如下图所示

通过使用 yield关键词,字典的key就像在流水线上,从内到外逐层组装,从而形成完整的路径。
