记住100个python技巧,远不如来一次实战。
拿到一份json数据,大致结构如下:
这是制作自动化生成 echarts (pyecharts) 代码小工具,遇到的第一个难题。我们需要从这份 json 文件中提取所有的相关配置信息。
难点在于,这些配置中存在不确定深度的嵌套。比如:title 属性下存在其他的属性,记录在 properties 里面,并且下层每个属性都有可能存在 properties。
我们需要提取所有的属性,并且展平成一个表,结果大致如下:
parent 记录了属性的访问路径,这样子我们可以保留他们的上下层关系信息。
相信经常到处收藏各种 python 技巧文章的小伙伴,马上就会想到用递归解决。但我不喜欢使用递归,今天使用另一种方式解决。
不要忘记一键三连。你的点赞、收藏、关注,是我创作的动力。
使用任意 json 库把数据加载到 python 中:
这里用 orjson ,你也可以使用其他的库,得到的是一个嵌套字典。
一开始,我们先不考虑循环,判断的逻辑代码怎么写。拆解问题才是最重要的。
现在只考虑一小块数据:
上图假设有一个函数 extract_item
,传入 名字和对应的数据字段。函数就能返回我们需要提取的信息。
这个函数就非常容易实现:
返回字典不太好看,可以定义一个数据类:
现在返回结果:
就这?明明 title 数据里面还有下一层的数据( properties
),目前为止根本啥也没有做成。
别急,接下来就是本节重点。目前为止我们只要知道, extract_item
函数的调用就可以了。
接下来,定义另一个处理函数:
大致的流程图:
extract_item
现在得到两个结果(为了简化显示,把数据裁剪只有两个大项):
现在虽然没有提取两个大项下层的数据,但是我们已经注意到,代码中的列表 stack
,其实就类似一个任务容器,所以只要想办法把下一层的数据添加到 stack
中即可,只需要两句代码即可:
properties
key),有就把下层字典数据放入任务列表( stack
)就这么简单,其实流程与递归几乎一模一样,并且我们更容易控制其他信息的传递和结果的返回(稍后会看到)。
目前的代码只是在函数里面打印,不太合理。修改为输出结果。有两个选择,一是直接返回结果列表,另一种是把函数搞成生成器,我选择后者:
还没完,现在数据丢失了上下层的信息。还缺少一个 parent 字段,记录当前项的上层是谁。
显然,我们需要在调用 extract_item
时传入 parent 信息:
在哪个环节能得到上下层的信息?肯定是遍历任务列表的地方:
怎么加上,定义一个函数负责这个事情:
实现代码就一句,调用结果我用注释写出来(行5-8)
有了这个函数,稍微修改原来的代码,就能得到结果:
key
)现在结果没有问题了
到此我们完成了小工具的数据预处理的部分。下一节就可以做一些更复杂更有意思的功能:- 搜索功能 - 缓存 - 按不同的权重,把更重要的搜索结果项更靠前展示