0

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

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

所以对于每个值,假设运行我执行一个查询,它返回另一组数据,然后选择该组的每个值并运行查询,这将给出另一组,最后我到了只有一个项目得到返回的地步。一旦我完成了每个子元素的最后一个元素,Run我就会移动Jump并继续。

我之前问过这个问题,但没有得到任何结果,所以人们告诉我删除代码并再次问这个问题。这是我几天前问的同一问题的链接。我需要实现类似 disjoin set 的东西吗?

4

2 回答 2

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

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

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

[elem for elem in leaves(lst)]是一个列表推导,它只是构建一个列表,其中包含elem由 迭代的每个元素leaves

于 2011-11-09T05:02:27.927 回答
0

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

于 2011-11-09T04:57:51.240 回答