一说起字典中获取数据,我去这多简单
小案例上来:
#方法一
from jsonpath import jsonpath
ss = {"a":1,"b":2}
result = jsonpath(ss,"$..a")[0]
print(result)
#方法二
from glom import glom
result = glom(ss,'a')
print(result)
#方法三
result = ss.get("a")
#方法四
result = ss['a']
多简单,再来一个案例,我们遇到的实际情况,可不是这么简单:
ss = {
"data":[
{"name":"a1","age":18},
{"name":"a2","age":15},
{"name":"a3"},
]
}
#我们要获取name和对应age
for s in ss["data"]:
#这么写
name = s["name"]
age = s["age"]
#还是这么写
name = jsonpath(s,"$..name")[0]
age = jsonpath(s,"$..age")[0]
# 这么写给
name = glom(s,'name')
age = glom(s,'age')
都会报错:
我们只能用 get()
name = s.get("name","")
age = s.get("age","")
每次这么写感觉会很麻烦,后来发现可以自定义类的方式,每次把字典先格式化一下,无对应值返回None
我们自定义一个类,继承dict,然后实现它的__missing__方法:
class OurDict(dict):
def __missing__(self, key):
return None
a = OurDict({'a': 1, 'b': 2})
print(a['x'])
在在后来,在 Python 的collections
工具模块中,有一个defaultdict
实现了类似的事情。我们看它的使用方法
from collections import defaultdict
a = defaultdict(str)
a['a'] = 1
a['b'] = 2
print(a)
print(a['x'])
print(a)
a = defaultdict(str)
接收一个函数,让a
变量成为一个defaultdict
类型的对象,它可以像普通字典一样被赋值和读取。
但是当你读取一个不存在的 key 时,它会自动生成一个默认值,并把默认值和这个 key 插入到字典中。这个默认值取决于你在defaultdict
传入的参数。如果传入的是str
那么默认值就是空字符串,如果是int
那么默认值就是0.当然你也可以传入自定义的一个函数,从而控制这个默认值。
over