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群发邮件实例代码
Jan 03 Python
python将ip地址转换成整数的方法
Mar 17 Python
Python决策树分类算法学习
Dec 22 Python
python基于物品协同过滤算法实现代码
May 31 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
Oct 28 Python
python字典setdefault方法和get方法使用实例
Dec 25 Python
python模拟点击网页按钮实现方法
Feb 25 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
Feb 27 Python
对Matlab中共轭、转置和共轭装置的区别说明
May 11 Python
Python pickle模块常用方法代码实例
Oct 10 Python
Python基础教程,Python入门教程(超详细)
Jun 24 Python
如何利用python创作字符画
Jun 25 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在字符断点处截断文字的实现代码
2011/04/21 PHP
PHP 获取远程网页内容的代码(fopen,curl已测)
2011/06/06 PHP
解析php中获取url与物理路径的总结
2013/06/21 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
总结PHP删除字符串最后一个字符的三种方法
2016/08/30 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
使用ucenter实现多站点同步登录的讲解
2019/03/21 PHP
JavaScript动态创建link标签到head里的方法
2014/12/22 Javascript
jQuery 选择器详解
2015/01/19 Javascript
JavaScript中常见的字符串操作函数及用法汇总
2015/05/04 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
jQuery实现带分组数据的Table表头排序实例分析
2015/11/24 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
javaScript之split与join的区别(详解)
2017/11/08 Javascript
Vue-component全局注册实例
2018/09/06 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
Python单链表简单实现代码
2016/04/27 Python
Python单例模式的两种实现方法
2017/08/14 Python
python获取命令行输入参数列表的实例代码
2018/06/23 Python
详解python中的装饰器
2018/07/10 Python
详解PyCharm安装MicroPython插件的教程
2019/06/24 Python
PYTHON绘制雷达图代码实例
2019/10/15 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
Django choices下拉列表绑定实例
2020/03/13 Python
Python 存取npy格式数据实例
2020/07/01 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
Html5跳转到APP指定页面的实现
2020/01/14 HTML / CSS
HealthElement海外旗舰店:新西兰大卖场
2018/02/23 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
装修致歉信
2014/01/15 职场文书
优秀教导主任事迹材料
2014/05/09 职场文书