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 unittest单元测试框架总结
Sep 08 Python
使用Python实现在Windows下安装Django
Oct 17 Python
对python创建及引用动态变量名的示例讲解
Nov 10 Python
Python3爬虫之urllib携带cookie爬取网页的方法
Dec 28 Python
pandas数据集的端到端处理
Feb 18 Python
python从入门到精通 windows安装python图文教程
May 18 Python
django admin组件使用方法详解
Jul 19 Python
python3 tkinter实现添加图片和文本
Nov 26 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
Dec 07 Python
Python实例教程之检索输出月份日历表
Dec 16 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
php实现文件下载更能介绍
2012/11/23 PHP
smarty基础之拼接字符串的详解
2013/06/18 PHP
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
php在linux下检测mysql同步状态的方法
2015/01/15 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
JavaScript 替换Html标签实现代码
2009/10/14 Javascript
js showModalDialog弹出窗口实例详解
2014/01/07 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
jstree的简单实例
2016/12/01 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
koa2实现登录注册功能的示例代码
2018/12/03 Javascript
node.js Promise对象的使用方法实例分析
2019/12/26 Javascript
微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)
2020/03/10 Javascript
Json实现传值到后台代码实例
2020/06/30 Javascript
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
对于Python编程中一些重用与缩减的建议
2015/04/14 Python
Python 实现网页自动截图的示例讲解
2018/05/17 Python
详解python中的装饰器
2018/07/10 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
外贸业务员求职信
2014/06/16 职场文书
建设幸福中国演讲稿
2014/09/11 职场文书
2014基建处领导班子“四风”对照检查材料思想汇报
2014/10/04 职场文书
群众路线剖析材料(四风)
2014/11/05 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL