我有以下代码,它试图涵盖字典遍历的大多数情况,并将其输出为缩进文本(根据字典中项目的嵌套进行缩进(。有两个问题:
- 我认为一开始的支票,它迎合了"raw_list";,有点麻烦,但我想不出更好的办法了
- 我无法使级别变量正确反映其位置
谢谢。我认为递归的其余部分是正确的。。。
a = {
"raw_list" : [1,2,3],
"a" : 1,
"b" : 2,
"mydict": {
"c":3,
"d":4
},
"mydict2": {
"c":5,
"d":6
},
"list1": [
{
"e1":7,
"e2":8
},
{
"e3":9,
"e4":10
}
],
"list2": [
{
"f1":11,
"f2":12
}
]
}
def process_data(data,level):
if not isinstance(data,list) and not isinstance(data,dict) :
print("t"*level + str(data))
return
for element, val in data.items():
if isinstance(val, dict):
print("t"*level + "DICT:" + element)
level+=1
process_data(val,level)
elif isinstance(val, list):
print("t"*level + "LIST:" + element)
level += 1
for i, item in enumerate(val):
process_data(item,level)
else:
print("t"*level+element + ":" + str(val))
level-=1
process_data(a,1)
收到这个:
LIST:test
1
2
3
a:1
b:2
DICT:mydict
c:3
d:4
DICT:mydict2
c:5
d:6
LIST:list1
e1:7
e2:8
e3:9
e4:10
LIST:list2
f1:11
f2:12
但是想要这个:
LIST:test
1
2
3
a:1
b:2
DICT:mydict
c:3
d:4
DICT:mydict2
c:5
d:6
LIST:list1
e1:7
e2:8
e3:9
e4:10
LIST:list2
f1:11
f2:12
您正在为循环中的每个元素递增level
。相反,请尝试删除level += 1
,并将递增的level
传递到递归调用中:process_data(item, level + 1)
。
def process_data(data,level):
if not isinstance(data,list) and not isinstance(data,dict) :
print("t"*level + str(data))
return
for element, val in data.items():
if isinstance(val, dict):
print("t"*level + "DICT:" + element)
process_data(val,level + 1)
elif isinstance(val, list):
print("t"*level + "LIST:" + element)
for i, item in enumerate(val):
process_data(item,level + 1)
else:
print("t"*level+element + ":" + str(val))