Skip to main content
 首页 » 编程设计

python之如何获取嵌套字典列表中所有键的路径

2025年05月04日19lonelyxmas

我想获取列表中嵌套字典的所有键的路径。例如,如果我的字典如下所示

{ 
"persons": [{ 
    "id": "f4d322fa8f552", 
    "address": { 
        "building": "710", 
        "coord": "[123, 465]", 
        "street": "Avenue Road", 
        "zipcode": "12345" 
    }, 
    "cuisine": "Chinese", 
    "grades": [{ 
        "date": "2013-03-03T00:00:00.000Z", 
        "grade": "B", 
        "score": { 
          "x": 3, 
          "y": 2 
        } 
    }, { 
        "date": "2012-11-23T00:00:00.000Z", 
        "grade": "C", 
        "score": { 
          "x": 1, 
          "y": 22 
        } 
    }], 
    "name": "Shash" 
}] 
} 

我想得到这样的路径 path = [['persons'], ['persons','id'],['persons','address'],['persons','address','building']...] 直到最后一个键。

我试图遍历整个字典来追加路径变量。试图从 Print complete key path for all the values of a python nested dictionary 中获得一些灵感但我无法获得列表中的路径。

还有其他可能的方法吗?

请您参考如下方法:

您可以递归地描述数据结构,这是使用队列 q 与递归的一种方法。但很难判断这是否是您要查找的内容,因为它显示了列表索引,但可以很容易地排除它们:

def get_paths(d): 
    q = [(d, [])] 
    while q: 
        n, p = q.pop(0) 
        yield p 
        if isinstance(n, dict): 
            for k, v in n.items(): 
                q.append((v, p+[k])) 
        elif isinstance(n, list): 
            for i, v in enumerate(n): 
                q.append((v, p+[i]))   # Change to q.append((v, p)) to remove index 
 
In []: 
list(get_paths(d)) 
 
Out[]: 
[[], 
 ['persons'], 
 ['persons', 0], 
 ['persons', 0, 'id'], 
 ['persons', 0, 'address'], 
 ['persons', 0, 'cuisine'], 
 ['persons', 0, 'grades'], 
 ['persons', 0, 'name'], 
 ['persons', 0, 'address', 'building'], 
 ['persons', 0, 'address', 'coord'], 
 ['persons', 0, 'address', 'street'], 
 ['persons', 0, 'address', 'zipcode'], 
 ['persons', 0, 'grades', 0], 
 ['persons', 0, 'grades', 1], 
 ['persons', 0, 'grades', 0, 'date'], 
 ['persons', 0, 'grades', 0, 'grade'], 
 ['persons', 0, 'grades', 0, 'score'], 
 ['persons', 0, 'grades', 1, 'date'], 
 ['persons', 0, 'grades', 1, 'grade'], 
 ['persons', 0, 'grades', 1, 'score'], 
 ['persons', 0, 'grades', 0, 'score', 'x'], 
 ['persons', 0, 'grades', 0, 'score', 'y'], 
 ['persons', 0, 'grades', 1, 'score', 'x'], 
 ['persons', 0, 'grades', 1, 'score', 'y'],