解析字典中的字典
举个例子,我有一个包含字典的字典,这个字典是一个返回的JSON对象:
{
u'BrowseNode': {
u'Ancestors': {
u'BrowseNode': {
u'Ancestors': {
u'BrowseNode': {
u'Ancestors': {
u'BrowseNode': {
u'Ancestors': {
u'BrowseNode': {
u'BrowseNodeId': 283155,
u'Name': u'Books'
}
},
u'BrowseNodeId': 1000,
u'IsCategoryRoot': 1,
u'Name': u'Subjects'
}
},
u'BrowseNodeId': 75,
u'Name': u'Science'
}
},
u'BrowseNodeId': 14545,
u'Name': u'Physics'
}
},
u'BrowseNodeId': 226697,
u'Name': u'Electromagnetism'
}
}
我想要提取出“Name”这个键的值,但不想改变这个Python对象(也就是说,不想把它转换成其他格式或类似的操作)
输出应该是这样的:
Books, Subjects, Science, Physics, Electromagnetism
谢谢
3 个回答
1
经典的递归用法。
我随便想的:
- 写一个函数,这个函数需要两个参数,一个是字典,另一个是列表。
- 在函数内部,遍历字典里的所有键。
- 如果这个键是“Name”,就把它的值加到列表里。
- 如果不是,而且这个键的值是一个字典,那就再次调用这个函数,把这个字典和包含名字的列表传进去。
- 最后,函数只需要返回这个字典。
要获取结果,可以调用 names = func(baseDict, [])
。
1
def print_name(d):
name = d.get('Name')
if name:
print name
ancestors = d.get('Ancestors')
if ancestors:
print_name(ancestors)
递归地打印名字属性……
2
类似这样的代码也适用于给定的数据,而且它不是递归的:
def collect_names( node ):
names = []
while True:
names.append(node[u'Name'])
try:
# deeper node
node = node[u'Ancestors'][u'BrowseNode']
except KeyError:
# we are done, no ancestors
return names[::-1]
print collect_names(data[u'BrowseNode'])
# >> [u'Books', u'Subjects', u'Science', u'Physics', u'Electromagnetism']