Python:算法遍历树在每个节点处扩展

时间:2011-11-09 04:06:24

标签: python algorithm disjoint-sets

我有一个字典,其中包含id和每个ID的多个值,这些字符串都是字符串。对于每个Id的每个值,我进行数据库查询并得到设置结果:

{111: Run, Jump, swim}
{222: Eat, drink}

所以对于每个值,让我们说运行我执行一个查询,它返回另一组数据,然后选择该组的每个值并运行查询,这将给出另一个集合,最后我来到一个只有一个项目得到的点返回。一旦我完成Run的每个子元素的最终元素,然后我移动到Jump并继续。

之前我问过这个问题,但没有得到任何结果,所以人们告诉我删除代码,然后再问这个问题。以下是几天前我问过的同一个问题的link。我是否需要实现像disjoin set这样的东西?

2 个答案:

答案 0 :(得分:2)

您可以将类别/子类别视为一个树,每个节点有N个分支(取决于您拥有的分类数)。根据我的收集,你基本上想要生成一个有序的树叶列表。

一种简单的方法是通过生成器(使用原始问题中的术语):

def lookup(elem):
    # do your SQL call here for a given category 'elem' and return
    # a list of it's subcategories
    return []

def leaves(lst):
    if lst:
        for elem in lst:                          # for every category
            for sublist in leaves(lookup(elem)):  # enumerate it's sub categories
                yield sublist                     # and return it
            yield elem                            # once lookup(elem) is [] return elem

d = { 111: [Run, Jump, swim] , 222: [Eat, drink] }

for key, lst in d.items():
    print key, [elem for elem in leaves(lst)]

如果您不熟悉生成器,它们只是迭代器构造,它“生成”值而不是返回它们。不同之处在于,只会暂停该位置的迭代器,该迭代器将在请求下一个值时停止。

通过在生成器内部进行一些巧妙的递归,您可以简单地解析整个树。

[elem for elem in leaves(lst)]是一个列表理解,它只是为elem迭代的每个元素构建一个包含leaves的列表。

答案 1 :(得分:0)

这看起来像普通的树遍历。您可以使用BFSDFS