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 19 Python
python数据处理实战(必看篇)
Jun 11 Python
Python实现的密码强度检测器示例
Aug 23 Python
Python 查看文件的读写权限方法
Jan 23 Python
Python数据类型之Dict字典实例详解
May 07 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
May 13 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
Python  Django 母版和继承解析
Aug 09 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
python实现全排列代码(回溯、深度优先搜索)
Feb 26 Python
python列表切片和嵌套列表取值操作详解
Feb 27 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 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上传图片重命名的6种解决方法的详细介绍
2013/04/28 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
javascript css styleFloat和cssFloat
2010/03/15 Javascript
jquery中ajax学习笔记一
2011/10/16 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
node.js中的querystring.parse方法使用说明
2014/12/10 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
2015/08/10 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
jQuery基于排序功能实现上移、下移的方法
2016/11/26 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
微信小程序实现收藏与取消收藏切换图片功能
2018/08/03 Javascript
vue实现文件上传读取及下载功能
2020/11/17 Javascript
详解JavaScript中的Object.is()与"==="运算符总结
2020/06/17 Javascript
vue data对象重新赋值无效(未更改)的解决方式
2020/07/24 Javascript
[42:32]Secret vs Optic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python通过函数属性实现全局变量的方法
2015/05/16 Python
Python中返回字典键的值的values()方法使用
2015/05/22 Python
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
Python中logging日志库实例详解
2020/02/19 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
python把一个字符串切开的实例方法
2020/09/27 Python
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
微软新西兰官方网站:Microsoft New Zealand
2018/08/17 全球购物
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
浙大网新C/C++面试解惑
2015/05/27 面试题
演讲稿怎么写
2014/01/07 职场文书
公司中秋节活动方案
2014/02/12 职场文书
临床医师个人自我评价
2014/04/06 职场文书
2014年超市员工工作总结
2014/11/18 职场文书
文明单位创建材料
2014/12/24 职场文书
饭店服务员岗位职责
2015/02/09 职场文书
幼儿园2016年圣诞活动总结
2016/03/31 职场文书