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通过wxPython打开一个音频文件并播放的方法
Mar 25 Python
Python作用域用法实例详解
Mar 15 Python
浅谈Python 字符串格式化输出(format/printf)
Jul 21 Python
Python实现的手机号归属地相关信息查询功能示例
Jun 08 Python
python字符串的方法与操作大全
Jan 30 Python
python基础教程项目四之新闻聚合
Apr 02 Python
如何用Python实现简单的Markdown转换器
Jul 16 Python
Windows下安装Scrapy
Oct 17 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
Jan 30 Python
python3 tkinter实现添加图片和文本
Nov 26 Python
python实现监听键盘
Apr 26 Python
Python tensorflow卷积神经Inception V3网络结构
May 06 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
zf框架的registry(注册表)使用示例
2014/03/13 PHP
smarty半小时快速上手入门教程
2014/10/27 PHP
使用GD库生成带阴影文字的图片
2015/03/27 PHP
PHP生成短网址方法汇总
2016/07/12 PHP
详解php命令注入攻击
2019/04/06 PHP
javascript cookies操作集合
2010/04/12 Javascript
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
JavaScript包装对象使用详解
2015/07/09 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
2015/12/02 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
详解利用jsx写vue组件的方法示例
2017/07/17 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
基于Vue全局组件与局部组件的区别说明
2020/08/11 Javascript
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
2017/04/14 Python
python pytest进阶之fixture详解
2019/06/27 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
2013/01/09 HTML / CSS
什么是抽象
2015/12/13 面试题
送货司机岗位职责
2013/12/11 职场文书
电子专业毕业生自我鉴定
2014/01/22 职场文书
产品销售计划书
2014/05/04 职场文书
求职简历自荐信
2014/06/18 职场文书
红领巾心向党演讲稿
2014/09/10 职场文书
爱心募捐通知范文
2015/04/27 职场文书
朝花夕拾读书笔记
2015/06/29 职场文书
农村婚庆主持词
2015/06/29 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
Python开发简易五子棋小游戏
2022/05/02 Python
Hive HQL支持2种查询语句风格
2022/06/25 数据库