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中实现对Timestamp和Datetime及UTC时间之间的转换
Apr 08 Python
python实现在windows服务中新建进程的方法
Jun 30 Python
Python实现的手机号归属地相关信息查询功能示例
Jun 08 Python
Collatz 序列、逗号代码、字符图网格实例
Jun 22 Python
基于python的字节编译详解
Sep 20 Python
Python通过属性手段实现只允许调用一次的示例讲解
Apr 21 Python
python复制文件到指定目录的实例
Apr 27 Python
浅谈python中字典append 到list 后值的改变问题
May 04 Python
Python面向对象之类和实例用法分析
Jun 08 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
Jan 23 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(1)
2006/10/09 PHP
php中动态修改ini配置
2014/10/14 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
php实现refresh刷新页面批量导入数据的方法
2014/12/23 PHP
php将数组转换成csv格式文件输出的方法
2015/03/14 PHP
Js中sort()方法的用法
2006/11/04 Javascript
不懂JavaScript应该怎样学
2008/04/16 Javascript
Javascript 的addEventListener()及attachEvent()区别分析
2009/05/21 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
基于JQUERY的两个ListBox子项互相调整的实现代码
2011/05/07 Javascript
另一个javascript小测验(代码集合)
2011/07/27 Javascript
jquery 插件学习(三)
2012/08/06 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
JS正则替换掉小括号及内容的方法
2016/11/29 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
关于JavaScript中的this指向问题总结篇
2017/07/23 Javascript
layui select获取自定义属性方法
2018/08/15 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
24行JavaScript代码实现Redux的方法实例
2019/11/17 Javascript
Python的__builtin__模块中的一些要点知识
2015/05/02 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
python logging模块书写日志以及日志分割详解
2019/07/22 Python
Python控制台实现交互式环境执行
2020/06/09 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
CSS3实现头像旋转效果
2017/03/13 HTML / CSS
中国跨境在线时尚零售商:Bellelily
2018/04/06 全球购物
人事行政专员岗位职责
2014/07/23 职场文书
责任书范本
2014/08/25 职场文书
市场部经理岗位职责
2015/02/02 职场文书
可可西里观后感
2015/06/08 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
我的生日感言
2015/08/03 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python
2022年四月新番
2022/03/15 日漫