[英]Concatenate nested same key values in sub objects in python dictionary
I have this python dictionary that contains inside some nested objects:我有这个 python 字典,其中包含一些嵌套对象:
Input输入
{
"data": [
{
"name": "default",
"type": "pkg"
},
{
"name": "name1",
"subobj": [
{
"name": "subname1",
"subobj": [
{
"name": "sub-subname1",
"type": "pkg"
},
{
"name": "sub-subname2",
"type": "pkg"
}
],
"type": "folder"
}
],
"type": "folder"
}
]
}
I need to recursively create a list that concatenates the "name" keys (maintaining the hierarchy) like the following:我需要递归地创建一个连接“名称”键(维护层次结构)的列表,如下所示:
Output Output
default默认
name1/subname1/sub-subname1名称 1/子名称 1/子子名称 1
name1/subname1/sub-subname2名称 1/子名称 1/子子名称 2
How Could I achieve this Output taking in consideration that could be there infinite nested object in subobj?考虑到子obj中可能存在无限嵌套的object,我该如何实现这个Output?
You can do this with a rather simple recursive function, building up a prefix
string of parent names and finally yielding the combined names for all the pkg
items.您可以使用相当简单的递归 function 来完成此操作,构建父名称的
prefix
字符串,最后为所有pkg
项生成组合名称。
def get_names(lst, prefix=""):
for d in lst:
if d["type"] == "pkg":
yield f"{prefix}{d['name']}"
elif d["type"] == "folder":
yield from get_names(d["subobj"], f"{prefix}{d['name']}/")
Then call this for the data["data"]
item ( data
being your full nested dictionary):然后为
data["data"]
项目调用它( data
是您的完整嵌套字典):
for name in get_names(data["data"]):
print(name)
Output: Output:
default
name1/subname1/sub-subname1
name1/subname1/sub-subname2
I think this function should make the job我认为这个 function 应该能胜任
from typing import Union
def get_values(obj, only_add: str, prev_key: str = '') -> list:
keys = []
if type(obj) is dict:
for key, item in obj.items():
if key == only_add:
keys.append(f"{prev_key}/{item}")
prev_key = f"{prev_key}/{item}"
elif isinstance(item, (list, dict)):
keys.extend(get_values(item, only_add, prev_key))
elif type(obj) is list:
for item in obj:
keys.extend(get_values(item, only_add, prev_key))
return keys
Output of the function on your data Output 的 function 对您的数据
get_values(data, only_add="name")
>>> ['/default',
'/name1',
'/name1/subname1',
'/name1/subname1/sub-subname1',
'/name1/subname1/sub-subname2']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.