我有一个嵌套的字典:
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”)。
非常感谢你,任何帮助表示赞赏!
一个简单的方法做,这是把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