如何使用点和方括号表示法作为字符串键来访问嵌套字典/列表结构

问题描述 投票:0回答:1

假设我有一个嵌套字典,看起来像这样:

{
    "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或来自键路径的嵌套字典值自动创建缺失级别,但它不处理嵌套数组.

python dictionary dot-notation
1个回答
0
投票

我从这个答案中汲取灵感,想出了一种破解方法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
© www.soinside.com 2019 - 2024. All rights reserved.