将根返回到嵌套字典树中的特定叶

时间:2017-11-15 08:15:27

标签: python dictionary nested

嵌套字典树的格式为

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=[])

1 个答案:

答案 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, [])