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 相关文章推荐
数据挖掘之Apriori算法详解和Python实现代码分享
Nov 07 Python
python实现自动更换ip的方法
May 05 Python
Python中利用sqrt()方法进行平方根计算的教程
May 15 Python
Python计算一个文件里字数的方法
Jun 15 Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 Python
关于Python中空格字符串处理的技巧总结
Aug 10 Python
使用Python实现博客上进行自动翻页
Aug 23 Python
Python_LDA实现方法详解
Oct 25 Python
Python爬虫获取图片并下载保存至本地的实例
Jun 01 Python
详解分布式任务队列Celery使用说明
Nov 29 Python
python实现发送form-data数据的方法详解
Sep 27 Python
基于python实现地址和经纬度转换
May 19 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调用mysql存储过程实例分析
2014/12/29 PHP
帝国cms常用标签汇总
2015/07/06 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
Javascript----文件操作
2007/01/18 Javascript
基于jquery的网页SELECT下拉框美化代码
2010/10/28 Javascript
Jquery遍历checkbox获取选中项value值的方法
2014/02/13 Javascript
浅析tr的隐藏和显示问题
2014/03/05 Javascript
用循环或if语句从json中取数据示例
2014/08/18 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
2015/06/17 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
JS中使用FormData上传文件、图片的方法
2016/08/07 Javascript
VueJs与ReactJS和AngularJS的异同点
2016/12/12 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
jquery拼接ajax 的json和字符串拼接的方法
2017/03/11 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
浅谈实现vue2.0响应式的基本思路
2018/02/13 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
原生JS实现无缝轮播图片
2020/06/24 Javascript
python实现应用程序在右键菜单中添加打开方式功能
2017/01/09 Python
Django如何实现内容缓存示例详解
2017/09/24 Python
Python生成8位随机字符串的方法分析
2017/12/05 Python
python实现教务管理系统
2018/03/12 Python
Python中多个数组行合并及列合并的方法总结
2018/04/12 Python
pyqt实现.ui文件批量转换为对应.py文件脚本
2019/06/19 Python
Pytorch to(device)用法
2020/01/08 Python
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
大学应届毕业生个人求职信
2013/09/23 职场文书
员工考核评语大全
2014/04/26 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
领导班子三严三实心得体会
2014/10/13 职场文书
2015毕业生实习工作总结
2014/12/12 职场文书
百家讲坛观后感
2015/06/12 职场文书
企业安全隐患排查治理制度
2015/08/05 职场文书
vue router 动态路由清除方式
2022/05/25 Vue.js