简体   繁体   English

在 python 字典中的子对象中连接嵌套的相同键值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM