假设我有一个嵌套字典,看起来像这样:
{
"a": 1,
"b": 2,
"c": 3,
"d": {
"e": 4,
"f": 5
},
"g": [{
"h": 6,
"i": 7
},
{
"h": 8,
"i": 9
}]
}
但是,我已经获得了点符号形式的字符串键。例如,如果键是
key = "d.e"
,我如何使用它从上面的字典中获取值4
?同样,对于作为字典数组的嵌套对象,我想执行相同的操作来访问 g[0].h
和 g[1].h
。
我不想像如何使用点“.”那样转换字典。访问字典的成员?,我想保留使用字符串作为访问对象的键。
我尝试使用
reduce
函数,如使用点表示法字符串“a.b.c.d.e”检查嵌套字典,通过OP或来自键路径的嵌套字典值自动创建缺失级别,但它不处理嵌套数组.
我从这个答案中汲取灵感,想出了一种破解方法https://stackoverflow.com/a/31033676/2915050。该帖子的答案不处理嵌套数组,但是,我对该函数做了一个小更改以适应键内索引的使用,例如
g[0].h
def find(element, json):
keys = element.split('.')
rv = json
for key in keys:
if "[" not in key:
rv = rv[key]
else:
index_split = key.split("[")
bracket_split = index_split[-1].split("]")
index = int(bracket_split[0])
rv = rv[index_split[0]][index]
return rv
d = {
"a": 1,
"b": 2,
"c": 3,
"d": {
"e": 4,
"f": 5
},
"g": [{
"h": 6,
"i": 7
},
{
"h": 8,
"i": 9
}]
}
print(find("g[0].h", d))
#returns 6