Python中的嵌套字典迭代

2024-03-29 08:56:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典,它有几个选项键-值对,然后有一个sub-dict属性,它是一个具有相同属性的更多字典的列表,这些字典也有可能有sub-dict。在

在python中,我将其分解并单独处理,一次只更改一个,并希望将更改后的系统与整个系统重新组合。不过,我不知道如何迭代它。在

{base_system: {
name: "root",
description: "data dictionary",
common_data: {},
other_data: {},
more_data: {},
sub_systems: [
    {
        base_system: {
        name: "another system",
        description: "inherits from top level",
        sub_systems: [
            {
                base_system: {}
            },
            {
                base_system: {}
            }
        ]
        }
    },
    {
        base_system: {
            name: "one more system",
            description: "inheriting again",
            sub_systems: [
            {
                base_system: {
                name: "child system",
                description: "no kids here",
                other_data: {},
                more_data: {}
                }
            },
            {
                base_system: {
                name: "kid system",
                description: "no children here"
                }
            }
            ]
        }
    }
]
}

}

我想做这样的事情,但我不知道该怎么做才能使它递归。在

^{pr2}$

但是我不确定如何遍历嵌套字典,并且仍然拥有整个对象。在


Tags: nonamedatabase字典属性here系统
2条回答

您可以使用instanceof()方法检查某个内容是否是dict,如果为true,则可以让代码迭代该dict。在这种情况下,我将执行递归。在

def read_dict(some_dictionary):
    for key, value in some_dictionary:

        if isinstance(value, dict): 
            # if value is another dict, iterate through the key,value pairs in value
            read_dict(value) 
        elif isinstance(value, list):
            # if value is a list, add your own code to iterate through a list
            pass
        else:
            #not a dict, do what you needed to do eg:
            print 'value of %s is %s' % (key, value) 

read_dict(the_dict_object)

下面是递归遍历dict结构的示例代码。对于本例,它将描述替换为描述的大写。在

_DESC = "description"
_BASESYS = "base_system"
_SUBSYS = "sub_systems"

def uppercase_desc(system_info):
    """
    Change a system object such that the description is in upper-case.
    """
    if _BASESYS not in system_info:
        return

    subd = system_info[_BASESYS]
    if _DESC in subd:
        subd[_DESC] = subd[_DESC].upper()
    if _SUBSYS not in subd:
        return
    for d in subd[_SUBSYS]:
        uppercase_desc(d)

if __name__ == "__main__":
    import json
    with open("data.json", "rt") as f:
        s = f.read()
    system_info = json.loads(s)

    uppercase_desc(system_info)
    s = json.dumps(system_info, indent=4, sort_keys=True)
    print(s)

上面的代码对字典进行了适当的修改。这是一个有点棘手,但并不坏,在你去做一个副本,并返回副本。这可能更好。在

这里唯一棘手的部分是代码默认使用copy.deepcopy()。因为我们不知道字典中可能有什么内容,并且我们想返回一个副本,所以我们可以对所有内容调用copy.deepcopy();它将非常简单地工作,并对像3(值为3的整数对象)这样的简单对象执行正确的操作。在

^{pr2}$

另外,您发布的示例数据不是有效的JSON。我修改了它,在键的两边加上双引号,并用漂亮的缩进打印出来,使我的测试文件data.json。这里是:

{
    "base_system": {
        "name": "root", 
        "description": "data dictionary", 
        "more_data": {}, 
        "common_data": {}, 
        "sub_systems": [
            {
                "base_system": {
                    "name": "another system", 
                    "sub_systems": [
                        {
                            "base_system": {}
                        }, 
                        {
                            "base_system": {}
                        }
                    ], 
                    "description": "inherits from top level"
                }
            }, 
            {
                "base_system": {
                    "name": "one more system", 
                    "sub_systems": [
                        {
                            "base_system": {
                                "more_data": {}, 
                                "other_data": {}, 
                                "name": "child system", 
                                "description": "no kids here"
                            }
                        }, 
                        {
                            "base_system": {
                                "name": "kid system", 
                                "description": "no children here"
                            }
                        }
                    ], 
                    "description": "inheriting again"
                }
            }
        ], 
        "other_data": {}
    }
}

相关问题 更多 >