在key path的帮助下从嵌套字典中获取值,下面是dict
:
json = {
"app": {
"Garden": {
"Flowers": {
"Red flower": "Rose",
"White Flower": "Jasmine",
"Yellow Flower": "Marigold"
}
},
"Fruits": {
"Yellow fruit": "Mango",
"Green fruit": "Guava",
"White Flower": "groovy"
},
"Trees": {
"label": {
"Yellow fruit": "Pumpkin",
"White Flower": "Bogan"
}
}
}
该方法的输入参数是用点分隔的关键路径,从关键路径=“app.Garden.Flowers.白色Flower”需要打印'Jasmine'。
import json
with open('data.json') as data_file:
j = json.load(data_file)
def find(element, JSON):
paths = element.split(".")
# print JSON[paths[0]][paths[1]][paths[2]][paths[3]]
for i in range(0,len(paths)):
data = JSON[paths[i]]
# data = data[paths[i+1]]
print data
find('app.Garden.Flowers.White Flower',j)
9条答案
按热度按时间06odsfpq1#
这是fold的一个示例,你可以这样简洁地写它:
或者更Python化一些(因为
reduce()
由于可读性差而不受欢迎),如下所示:flvtvl502#
我也遇到过类似的情况,发现了这个dpath module。又好又容易。
wxclj1h53#
我建议您使用
python-benedict
,它是一个python dict子类,具有完全的keypath支持和许多实用方法。您只需要发布现有的命令:
这里的库和文档:https://github.com/fabiocaccamo/python-benedict
注:本人是本项目的作者
ca1c2owp4#
您的代码很大程度上依赖于键名中没有出现任何点,您可能能够控制这一点,但不一定。
我会选择使用元素名称列表的通用解决方案,然后生成列表,例如,通过拆分键名称的虚线列表:
一旦你有了这个类,就很容易转换你的法令并获得“茉莉花”:
将为您提供:
与来自dict的普通
get()
类似,如果指定的键(列表)在树中不存在,则会得到None
,并且可以指定第二个参数作为返回值,而不是None
cmssoen25#
非常接近了。你需要(正如你在评论中所说的)递归地遍历JSON主对象。你可以通过存储最外层键/值的结果,然后使用它来获得下一个键/值,等等,直到你没有路径为止。
不过,您仍然需要注意KeyErrors。
aamkag616#
一行程序:
nbnkbykc7#
1.与lambda相比速度更快。
1.在lambda和其他情况下不需要单独的错误处理。
1.可读性和简洁性可以成为项目中的实用程序功能/帮助器
unguejic8#
编写了在dict中处理列表的函数。
kzmpq1sx9#