python使用yield压平嵌套字典的超简单方法


Posted in Python onNovember 02, 2019

我们经常遇到各种字典套字典的数据,例如:

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
}

你肯定想到了使用递归来解决这个问题,那么你可以试一试,看看你的递归函数有多少行代码。

今天,我们使用yield关键字来实现这个需求,在不炫技的情况下,只需要8行代码。在炫技的情况下,只需要3行代码。

要快速地把这个嵌套字典压扁,我们需要从下网上来处理字段。例如对于b->e->f->4这条路径,我们首先把最里面的{'f': 4}转换为一个元组('f', 4)。然后,把这个元组向上抛出,于是得到了元组('e', ('f', 4))。我们把 e拼接到f的前面,变为:('e_f', 4),继续往上抛出,得到('b', ('e_f', 4))。再把b拼接到e_f上面,得到('b_e_f', 4)。完成一条线路的组装。

这个逻辑如果使用yield关键字来实现,就是:

def flat(x):
  for key, value in x.items():
    if isinstance(value, dict):
      for k, v in flat(value):
        k = f'{key}_{k}'
        yield (k, v)
    else:
      yield (key, value)

运行结果如下图所示:

python使用yield压平嵌套字典的超简单方法

通过使用 yield关键字,字典的key会像是在流水线上一样,一层一层从内向外进行组装,从而形成完整的路径。

在下一篇文章中,我们继续使用yield关键字来解决字典与列表混合嵌套的情况。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python将人民币转换大写的脚本代码
Feb 10 Python
python获取从命令行输入数字的方法
Apr 29 Python
Python基于回溯法子集树模板解决数字组合问题实例
Sep 02 Python
python决策树之C4.5算法详解
Dec 20 Python
Python模拟脉冲星伪信号频率实例代码
Jan 03 Python
python requests爬取高德地图数据的实例
Nov 10 Python
python装饰器相当于函数的调用方式
Dec 27 Python
python面向对象之类属性和类方法案例分析
Dec 30 Python
Python自动采集微信联系人的实现示例
Feb 28 Python
基于SpringBoot构造器注入循环依赖及解决方式
Apr 26 Python
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
Apr 13 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
Jun 21 Python
基于python实现从尾到头打印链表
Nov 02 #Python
pandas 空数据处理方法详解
Nov 02 #Python
python pyinstaller打包exe报错的解决方法
Nov 02 #Python
python自动生成model文件过程详解
Nov 02 #Python
python__name__原理及用法详解
Nov 02 #Python
简单了解python中的f.b.u.r函数
Nov 02 #Python
如何在python中实现随机选择
Nov 02 #Python
You might like
如何给phpadmin一个保护
2006/10/09 PHP
PHP 观察者模式的实现代码
2013/05/10 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
js toFixed()方法的重写实现精度的统一
2014/03/06 Javascript
小米公司JavaScript面试题
2014/12/29 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
js给table赋值的实例代码
2016/10/13 Javascript
nodejs实现发出蜂鸣声音(系统报警声)的方法
2017/01/18 NodeJs
js实现无缝滚动图
2017/02/22 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
Python中字符串格式化str.format的详细介绍
2017/02/17 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
2017/12/18 Python
Python 生成 -1~1 之间的随机数矩阵方法
2018/08/04 Python
python flask框架实现重定向功能示例
2019/07/02 Python
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
求职推荐信
2013/10/28 职场文书
餐饮周年庆活动方案
2014/08/14 职场文书
2014大学辅导员工作总结
2014/12/02 职场文书
2015年党性分析材料
2014/12/19 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
关于法制教育的宣传语
2015/07/13 职场文书
2016年父亲节寄语
2015/12/04 职场文书
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python
JavaScript原型链详解
2021/11/07 Javascript
关于EntityWrapper的in用法
2022/03/22 Java/Android
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS