>我有这样的对象:
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