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求两个list的差集、交集与并集的方法
Nov 01 Python
Python中的字典遍历备忘
Jan 17 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
May 02 Python
python实现类的静态变量用法实例
May 08 Python
python 排序算法总结及实例详解
Sep 28 Python
python中defaultdict的用法详解
Jun 07 Python
PyTorch搭建多项式回归模型(三)
May 22 Python
python 求一个列表中所有元素的乘积实例
Jun 11 Python
基于pandas中expand的作用详解
Dec 17 Python
对pytorch的函数中的group参数的作用介绍
Feb 18 Python
python3.4中清屏的处理方法
Jul 06 Python
python定时截屏实现
Nov 02 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的网址
2006/11/25 PHP
PHP+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
php 提速工具eAccelerator 配置参数详解
2010/05/16 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
thinkPHP5 ACL用户权限模块用法详解
2017/05/10 PHP
JavaScript 对话框和状态栏使用说明
2009/10/25 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
JavaScript动态创建form表单并提交的实现方法
2015/12/10 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
2016/08/11 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
2019/07/16 Javascript
js blob类型url的视频下载问题的解决
2019/11/29 Javascript
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
2020/05/09 Javascript
[06:37]2014DOTA2国际邀请赛 昔日王者渴望重回巅峰
2014/07/12 DOTA
python迭代器的使用方法实例
2013/11/21 Python
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
python获取指定网页上所有超链接的方法
2015/04/04 Python
Python3安装Pymongo详细步骤
2017/05/26 Python
Python调用微信公众平台接口操作示例
2017/07/08 Python
python list是否包含另一个list所有元素的实例
2018/05/04 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
Python2与Python3的区别实例分析
2019/04/11 Python
python实现LRU热点缓存及原理
2019/10/29 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
python实现canny边缘检测
2020/09/14 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
客服实习的个人自我鉴定
2013/10/20 职场文书
政府法律服务方案
2014/06/14 职场文书
房产销售独家委托书范本
2014/10/01 职场文书
横店影视城导游词
2015/02/06 职场文书
学雷锋活动简报
2015/07/20 职场文书
只用Python就可以制作的简单词云
2021/06/07 Python
python实现会员信息管理系统(List)
2022/03/18 Python