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与Java间Socket通信实例代码
Mar 06 Python
python根据unicode判断语言类型实例代码
Jan 17 Python
python2.7 json 转换日期的处理的示例
Mar 07 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
Jun 27 Python
centos7中安装python3.6.4的教程
Dec 11 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
Feb 07 Python
Windows下Anaconda和PyCharm的安装与使用详解
Apr 23 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 Python
keras 多任务多loss实例
Jun 22 Python
Python classmethod装饰器原理及用法解析
Oct 17 Python
Python安装使用Scrapy框架
Apr 12 Python
Python四款GUI图形界面库介绍
Jun 05 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
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
2016/03/21 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
农历与西历对照
2006/09/06 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
js查看一个函数的执行时间实例代码
2015/09/12 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
Layui数据表格之获取表格中所有的数据方法
2018/08/20 Javascript
JS实现页面跳转与刷新的方法汇总
2019/08/30 Javascript
javaScript把其它类型转换为Number类型
2019/10/13 Javascript
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
python 实现删除文件或文件夹实例详解
2016/12/04 Python
python僵尸进程产生的原因
2017/07/21 Python
基于Python对象引用、可变性和垃圾回收详解
2017/08/21 Python
详谈Python高阶函数与函数装饰器(推荐)
2017/09/30 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
使用Python的toolz库开始函数式编程的方法
2018/11/15 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
Python和Sublime整合过程图示
2019/12/25 Python
Python爬虫程序架构和运行流程原理解析
2020/03/09 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
python集合的新增元素方法整理
2020/12/07 Python
高一生物教学反思
2014/01/17 职场文书
英语生日邀请函
2014/01/23 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
教师个人自我剖析材料
2014/09/29 职场文书
安全生产工作汇报
2014/10/28 职场文书
安全先进班组材料
2014/12/26 职场文书
幼儿园保育员随笔
2015/08/14 职场文书
css3 文字断裂效果
2022/04/22 HTML / CSS
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server