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 查找文件夹下所有文件 实现代码
Jul 01 Python
Python基于DES算法加密解密实例
Jun 03 Python
python互斥锁、加锁、同步机制、异步通信知识总结
Feb 11 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
Jun 13 Python
对numpy中的transpose和swapaxes函数详解
Aug 02 Python
解析Python的缩进规则的使用
Jan 16 Python
Python Django 封装分页成通用的模块详解
Aug 21 Python
pandas 缺失值与空值处理的实现方法
Oct 12 Python
Python 定义只读属性的实现方式
Mar 05 Python
python 异步async库的使用说明
May 04 Python
python绘制雷达图实例讲解
Jan 03 Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 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下正则来匹配dede模板标签的代码
2010/08/21 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
PHP排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
javascript高级学习笔记整理
2011/08/14 Javascript
json2.js的初步学习与了解
2011/10/06 Javascript
JavaScript判断一个URL链接是否有效的实现方法
2011/10/08 Javascript
JS获取当前网页大小以及屏幕分辨率等
2014/09/05 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
jquery使用each方法遍历json格式数据实例
2015/05/18 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
AngularJS Module方法详解
2015/12/08 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
vue事件修饰符和按键修饰符用法总结
2017/07/25 Javascript
vue项目部署上线遇到的问题及解决方法
2018/06/10 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
详解在Javascript中进行面向切面编程
2019/04/28 Javascript
vue源码中的检测方法的实现
2019/09/26 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
[02:43]2018DOTA2亚洲邀请赛主赛事首日TOP5
2018/04/04 DOTA
Python面向对象之类的内置attr属性示例
2018/12/14 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
PyCharm更改字体和界面样式的方法步骤
2019/09/27 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
html5 Canvas画图教程(11)—使用lineTo/arc/bezierCurveTo画椭圆形
2013/01/09 HTML / CSS
为什么Runtime.exec(“ls”)没有任何输出?
2014/10/03 面试题
应聘护士自荐信
2013/10/21 职场文书
信息专业本科生个人的自我评价
2013/10/28 职场文书
婚前财产公证书
2014/04/10 职场文书
班级读书活动总结
2014/06/30 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
2014年中学生检讨书大全
2014/10/09 职场文书
升学宴家长答谢词
2015/09/29 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书