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实现ANN
Dec 20 Python
Python爬虫天气预报实例详解(小白入门)
Jan 24 Python
python实现随机漫步算法
Aug 27 Python
破解安装Pycharm的方法
Oct 19 Python
使用python绘制3维正态分布图的方法
Dec 29 Python
python3实现zabbix告警推送钉钉的示例
Feb 20 Python
Python字典遍历操作实例小结
Mar 05 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
Jun 28 Python
python实现DEM数据的阴影生成的方法
Jul 23 Python
详解Python3 pickle模块用法
Sep 16 Python
Python绘图之柱形图绘制详解
Jul 28 Python
PyQt5爬取12306车票信息程序的实现
May 14 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/10/09 PHP
PHP Zip解压 文件在线解压缩的函数代码
2010/05/26 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
PHP在linux上执行外部命令的方法
2017/02/06 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
再说AutoComplete自动补全之实现原理
2011/11/05 Javascript
javascript object array方法使用详解
2012/12/03 Javascript
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
jQuery循环遍历子节点并获取值的方法
2016/04/14 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
2017/07/10 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
JS实现判断有效的数独算法示例
2019/02/25 Javascript
Vue.js组件通信之自定义事件详解
2019/10/19 Javascript
js实现时钟定时器
2020/03/26 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
2020/04/28 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
详解Vue的组件中data选项为什么必须是函数
2020/08/17 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
Python+OpenCV实现图像融合的原理及代码
2018/12/03 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
2019/01/30 Python
python抖音表白程序源代码
2019/04/07 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
Python3实现将一维数组按标准长度分隔为二维数组
2019/11/29 Python
巴西男士个人护理产品商店:SHOP4MEN
2017/08/07 全球购物
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
2014年党风建设工作总结
2014/11/19 职场文书
vue3中的组件间通信
2021/03/31 Vue.js