python遇到嵌套结构数据,有比递归更容易的处理方式吗?

我是数据外星人 2024-02-19 06:07:55
前言

记住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 )

现在结果没有问题了

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

转发、关注我,私信"实战",获得本期源码和数据。

推荐文章: 1.

0 阅读:104

我是数据外星人

简介:感谢大家的关注