前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python遇到嵌套结构数据,别用递归,试试这种新方式

python遇到嵌套结构数据,别用递归,试试这种新方式

作者头像
咋咋
发布2024-01-17 17:11:45
1280
发布2024-01-17 17:11:45
举报
文章被收录于专栏:数据大宇宙

前言

记住100个python技巧,远不如来一次实战。

拿到一份json数据,大致结构如下:

这是制作自动化生成 echarts (pyecharts) 代码小工具,遇到的第一个难题。我们需要从这份 json 文件中提取所有的相关配置信息。

难点在于,这些配置中存在不确定深度的嵌套。比如:title 属性下存在其他的属性,记录在 properties 里面,并且下层每个属性都有可能存在 properties。

我们需要提取所有的属性,并且展平成一个表,结果大致如下:

parent 记录了属性的访问路径,这样子我们可以保留他们的上下层关系信息。

相信经常到处收藏各种 python 技巧文章的小伙伴,马上就会想到用递归解决。但我不喜欢使用递归,今天使用另一种方式解决。

不要忘记一键三连。你的点赞、收藏、关注,是我创作的动力。


准备工作

使用任意 json 库把数据加载到 python 中:

这里用 orjson ,你也可以使用其他的库,得到的是一个嵌套字典。

一开始,我们先不考虑循环,判断的逻辑代码怎么写。拆解问题才是最重要的。

现在只考虑一小块数据:

上图假设有一个函数 extract_item ,传入 名字和对应的数据字段。函数就能返回我们需要提取的信息。

这个函数就非常容易实现:

  • 行3:定义需要提取的键名
  • 行8:为字典加上一个 name 值

返回字典不太好看,可以定义一个数据类:

现在返回结果:

就这?明明 title 数据里面还有下一层的数据( properties ),目前为止根本啥也没有做成。

别急,接下来就是本节重点。目前为止我们只要知道, extract_item 函数的调用就可以了。


接下来,定义另一个处理函数:

大致的流程图:

  • 行2:把整个 properies 的数据放入一个 list,相当于流程图中的红色部分
  • 行4-8:不断从 list 中一个个取出,然后放入之前实现的函数 extract_item

现在得到两个结果(为了简化显示,把数据裁剪只有两个大项):

现在虽然没有提取两个大项下层的数据,但是我们已经注意到,代码中的列表 stack ,其实就类似一个任务容器,所以只要想办法把下一层的数据添加到 stack 中即可,只需要两句代码即可:

  • 行9-10:看看当前数据有没有下层数据(字典有没有 properties key),有就把下层字典数据放入任务列表( stack )

就这么简单,其实流程与递归几乎一模一样,并且我们更容易控制其他信息的传递和结果的返回(稍后会看到)。

目前的代码只是在函数里面打印,不太合理。修改为输出结果。有两个选择,一是直接返回结果列表,另一种是把函数搞成生成器,我选择后者:

还没完,现在数据丢失了上下层的信息。还缺少一个 parent 字段,记录当前项的上层是谁。


显然,我们需要在调用 extract_item 时传入 parent 信息:

在哪个环节能得到上下层的信息?肯定是遍历任务列表的地方:

怎么加上,定义一个函数负责这个事情:

实现代码就一句,调用结果我用注释写出来(行5-8)

有了这个函数,稍微修改原来的代码,就能得到结果:

  • 行14:parent 肯定是 option
  • 行17:取出时,就包含了 parent 信息
  • 行19:传入 parent
  • 行24:下一层的 parent ,等于当前项的 parent 加上 当前项的名字( key )

现在结果没有问题了

到此我们完成了小工具的数据预处理的部分。下一节就可以做一些更复杂更有意思的功能:- 搜索功能 - 缓存 - 按不同的权重,把更重要的搜索结果项更靠前展示

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据大宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 准备工作
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档