簡體   English   中英

在嵌套Dict中遞歸查找路徑

[英]Recursively finding paths in a nested Dict

我有一個嵌套的字典:

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

其中的路徑由每個級別(由句點分隔)組成。 我能夠瀏覽字典並獲得所需的大多數標題。 但是我的問題是重復的值。

問題:我遞歸地檢查字典並獲取所有值並將它們放在列表中。 然后,我再次在字典中搜索這些值,但是這次保存了構造標頭的路徑。 但是,使用重復的值(即值“ rootfs”),我只得到返回的第一個鍵值(“ type”:“ rootfs”)。

這是我從dict中獲取所有值的遍歷,這正是我想要的:

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上找到了它,並想對其進行修改以獲取重復值的每個唯一路徑(例如,對於值“ rootfs”,第一路徑:“ system.filesystem.type”,第二路徑:“ system.filesystem.device_name”)。

非常感謝,感謝您的幫助!

一種簡單的方法是將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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM