递归发现在嵌套字典路径

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

我有一个嵌套的字典:

d = {
 "@timestamp": "2019-01-08T19:33:50.066Z",
 "metricset": {
    "rtt": 2592,
    "name": "filesystem",
    "module": "system"
 },
 "system": {
    "filesystem": {
        "free_files": 9660022,
        "type": "rootfs",
        "device_name": "rootfs",
        "available": 13555355648,
        "files": 9766912,
        "mount_point": "/",
        "total": 19992150016,
        "used": {
            "pct": 0.322,
            "bytes": 6436794368
        },
        "free": 13555355648
    }
 },
 "host": {
    "name": "AA"
 },
 "beat": {
    "name": "AA",
    "hostname": "AA",
    "version": "6.3.2"
  }
}

我想这样做的是写这本字典到CSV文件。我想了CSV的标题是这样的:

system.filesystem.type

其中路径是通过用句点分隔每个级别组成。我可以去翻翻字典,并获得最需要我的头;然而,我的问题是重复的值。

问题:我递归经过字典和抓住所有的值,并把它们放在一个列表中。然后,我在寻找再次在字典中的值,但节省了这段时间的路径来构造头部。然而,随着重复值(即值“根文件系统”),我只得到了第一个键值(“类型”:“根文件”)返回。

这是我穿越抓住从字典,这不正是我想要的所有值:

def traverse(valuelist, dictionary):

    for k,v in dictionary.items():

       if isinstance(v, dict):
         traverse(valuelist,v)
       else:
         valuelist.append(v)

    return valuelist

现在,这里是抓住从上面的代码中的每个值的路径的代码:

def getpath(nested_dict, value, prepath=()):
    for k,v in nested_dict.items():
        path = prepath + (k,)
        if v == value: # found value
           return path
        elif hasattr(v, 'items'): # v is a dict
            p = getpath(v, value, path) # recursive call
            if p is not None:
                return p

这部分是不是我自己的代码。我发现它在这里SO和想修改它抓住了重复值每唯一的路径(即针对值“根文件”第1条路径:“system.filesystem.type”第二路径:“system.filesystem.device_name”)。

非常感谢你,任何帮助表示赞赏!

python dictionary recursion
1个回答
1
投票

一个简单的方法做,这是把getpath到发电机:

def getpath(nested_dict, value, prepath=()):
    for k,v in nested_dict.items():
        path = prepath + (k,)
        if v == value: # found value
            yield path # yield the value
        elif hasattr(v, 'items'):
            yield from getpath(v, value, path) # yield all paths from recursive call

这样,它递归yields每一个有效的路径。您可以使用它像这样:

for path in getpath(nested_dict, value):
    # do stuff with path
© www.soinside.com 2019 - 2024. All rights reserved.