嵌套字典树的格式为
categories = [{
'name': 'Cat1',
'children': [{
'name': 'SubCat1',
'children': [{
'name': 'SubSubCat1',
'children': []
}]
}]
}, {
'name': 'Cat2',
'children': []
}]
递归函数应该返回从root到特定叶子的路径。
可以说,function(categories, 'SubCat1')
应该返回包含['Cat1', 'SubCat1']
的列表。同样,function(categories, 'Cat2')
应返回['Cat2']
。
到目前为止取得的进展
def recurse_category(categories, to_find):
def _recurse_category(categories, to_find, path=[]):
for category in categories:
path.append(category['name'])
if len(category['children']) == 0 and category['name'] != to_find:
return path, False
if category['name'] == to_find:
return path, True
else:
recurse_category(
category['children'], to_find, path
)
return _recurse_category(categories, to_find, path=[])
答案 0 :(得分:1)
不要传递清单;它会累积所有搜索到的路径,而不仅仅是匹配的路径。通过连接,在递归时建立列表。您还需要处理递归调用的结果;你的代码忽略了那个结果。
以下工作,请注意,当我们递归(在if category['children']
中)时,代码必须检查是否在该子树中找到了路径:
def recurse_category(categories, to_find):
for category in categories:
if category['name'] == to_find:
return True, [category['name']]
if category['children']:
found, path = recurse_category(category['children'], to_find)
if found:
return True, [category['name']] + path
return False, []
这将返回一个布尔值(如果找到则为true)和路径:
>>> recurse_category(categories, 'SubCat1')
(True, ['Cat1', 'SubCat1'])
>>> recurse_category(categories, 'Cat2')
(True, ['Cat2'])
>>> recurse_category(categories, 'Nonesuch')
(False, [])