如何递归迭代复杂的 python 对象?



>我有这样的对象:

et = {  
"applications": [
{
"applications_application": 'value',
"application_journalNumber": 'value',
"appParticipants": [
{
"appParticipant_inn": "value",
"appParticipant_kpp": "value",
"legalForm_code": "value"
}
]
}
]
}

我需要递归地遍历它的所有键。我该怎么做?我想得到这样的东西:

applications
applications_application
application_journalNumber
appParticipants
appParticipant_inn
appParticipant_kpp
legalForm_code

我不起作用的解决方案:

def myprint(d):
for k, v in d.items():
if isinstance(v, dict):
myprint(v)
else:
if isinstance(v, list):
myprint(v[0])

附言每个数组中只有一个项目。

怎么样:

def traverse_dict(d):
keys = []
for key, item in d.items():
keys.append(key)
if isinstance(item, dict):
keys.extend(traverse_dict(item))
elif isinstance(item, list):
for d in item:
keys.extend(traverse_dict(d))
return keys

您可以将递归与生成器一起使用:

def _keys(d):
for a, b in d.items():
yield a
if isinstance(b, dict):
yield from _keys(b)
if isinstance(b, list):
for i in b:
yield from _keys(i)

et = {'applications': [{'applications_application': 'value', 'application_journalNumber': 'value', 'appParticipants': [{'appParticipant_inn': 'value', 'appParticipant_kpp': 'value', 'legalForm_code': 'value'}]}]}
print('n'.join(_keys(et)))

输出:

applications
applications_application
application_journalNumber
appParticipants
appParticipant_inn
appParticipant_kpp
legalForm_code

你离一个可行的解决方案不远了,我可以向你提出这个:

def myprint(d):
# print("Handling %s" % d)  # Debug logging
# This is the end condition on which you actually print the entry
if not isinstance(d, dict):
print("Entry: %s" % d)
else:
for k, v in d.items():
# print("Handling key: %s - value: %s" % (k, v))  # Debug logging
if isinstance(v, list):
myprint(v[0])
else:
myprint(k) # replace by myprint(v) to show the values 

这将内联打印字典中找到的所有值。

输出将如下所示:

Entry: applications_application
Entry: application_journalNumber
Entry: appParticipant_inn
Entry: appParticipant_kpp
Entry: legalForm_code

最新更新