Python中的嵌套字典迭代
我有一个字典,它有几个选项键值对,然后有一个sub_dict属性,它是一个具有相同属性的更多字典的列表,这些字典也有可能一直有sub_dict 在python中,我将其分解并单独处理,一次修改一个,并希望将修改后的系统与整个系统重新组合。但是我不知道如何迭代它Python中的嵌套字典迭代,python,dictionary,Python,Dictionary,我有一个字典,它有几个选项键值对,然后有一个sub_dict属性,它是一个具有相同属性的更多字典的列表,这些字典也有可能一直有sub_dict 在python中,我将其分解并单独处理,一次修改一个,并希望将修改后的系统与整个系统重新组合。但是我不知道如何迭代它 {base_system: { name: "root", description: "data dictionary", common_data: {}, other_data: {}, more_data: {}, sub_syste
{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"
}
}
]
}
}
]
}
}
我想做这样的事情,但我不知道该怎么做才能使它递归
#Have some recursive function to dig through the overall dictionary then test:
if the_dict_object["space_system"]["name"] == changed_json_system["space_system"]["name"]:
#then when it passes that if statement I can just set
the_dict_object = changed_json_system
但是我不知道如何迭代嵌套字典,并且仍然保留整个对象。您可以使用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的整数对象)这样的简单对象上正常工作并做正确的事情
另外,您发布的示例数据不是有效的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": {}
}
}
你想比较所有的值吗?我想检查一下我刚刚处理的系统/子系统的名称,看看它是否与我当前在字典中看到的名称匹配,如果匹配,我想用我刚刚处理的子系统替换该子系统。你可能也会喜欢这样:如果我这样做,将一个或两个递归更改为函数它改变了最初的一个?听起来你对python变量的作用域不太熟悉。我建议您尝试执行此命令,添加一些打印语句并进行调试。你会发现你的答案是这样的?你的意思是“存在”吗?我错了,是的,存在:)谢谢你的纠正。
{
"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": {}
}
}