最近在接触一些AI自动化的项目,发现几乎所有的传感器数据为了匹配API接口,数据格式都是JSON。这个对与常年几乎只用Data Frame的人来说一开始会很不习惯,稍微了解了一下python的递归函数,发现用递归函数可以方便好多。
本文会分4步讲解如何实现这个操作。
Step.1 最简单的递归函数
sample = ["a", "b", 1]
res = []
for v in sample:
if isinstance(v, str):
res.append(v)
print(res) # ["a", "b"]
寻找str构造的数据。
step.1纯属为了比较,无需多解释。
Step.2 双层数据结构的递归函数
sample = [["a", 1], "b"]
res = []
for arg in sample:
if isinstance(arg, str):
res.append(arg)
if isinstance(arg, list):
for v in arg:
if isinstance(v, str):
res.append(v)
print(res)
step.2的话相当于把step.1拆分成了两步。虽然得到了预期的结果,但是用到了两次if条件,使得整个代码变得有点冗长。如果需要有更多步骤的话,会产生更多的for循环和if条件分叉,代码会变得更加冗长。 所以需要递归函数。递归函数的宗旨就是把大事化小,把复杂的项目分割成简单的小块。在接下来的step.3里会用到递归函数把step.2简单化。
Step.3 从n层构造序列里获取str数据
sample = ["a",["b", 1, [[["c", 2], 3], 4], "d"], ["e"]]
想要预期得到的结果如下
["a", "b", "c", "d", "e"]
def get_str(arg):
res = []
if isinstance(arg,str):
res.append(arg)
elif isinstance(arg,list):
for v in arg:
res += get_str(v)
return res
print(get_str(sample))
整个函数的运行从下往上看,首先运行的是
for v in arg:
res += get_str(v)
当然此处的arg有三种情况,分别是
①res += get_str("a")
②res += get_str(["b", 1, [[["c", 2], 3], 4], "d"])
③res += get_str(["e"])
根据条件设定,每种情况的处理如下
①res += get_str("a")
情况1的话直接把结果添加到res里,到此结束
情况2的处理如下
②res += get_str(["b", 1, [[["c", 2], 3], 4], "d"])
res += get_str("b")
res += get_str(1)
res += get_str([[["c", 2], 3], 4])
res += get_str("d")
可以看到处理的并不完整,会继续处理。
情况3的处理如下
③res += get_str(["e"])
res += get_str("e")
完整的内部操作如下:
①res += get_str("a")
>> res.append("a") *
②res += get_str(["b", 1, [[["c", 2], 3], 4], "d"])
>> res += get_str("b")
>> res.append("b") *
res += get_str(1)
res += get_str([[["c", 2], 3], 4])
>> res += get_str([["c", 2], 3)
>> res += get_str(["c", 2])
>> res += get_str("c")
>> res.append("c") *
res += get_str(2)
res += get_str(4)
res += get_str("d")
>> res.append("d") *
③res += get_str(["e"])
>> res += get_str("e")
>> res.append("e") *
其中带*的结果会最终添加(return)到res里。用这样的办法就实现了使用get_str()函数在复杂的数据中寻找并添加str类型数据。和n个for循环比起来代码更加简洁明了。
Step.4 探索JSON
在复杂的JSON数据里寻找指定数据。假设在下面的例子里找到x,y,z
sample = {
"a": [{
"b": "y",
"c": [{
"d": [2,3]
}],
"e": {"g": "z"}
}],
"f": ["x"],
}
def get_str(arg):
res =[]
if isinstance(arg, str):
res.append(arg)
elif isinstance(arg, list):
for item in arg:
res += get_str(item)
elif isinstance(arg, dict):
for value in arg.values():
res += get_str(value)
return res
print(get_str(sample)) # ["x", "y", "z"]
原理是一样的,无非就是和step3相比多了一个dict层。
网友评论