递归?在Python中循环到n级

时间:2009-08-07 21:38:22

标签: python recursion

在python中工作我想提取具有以下结构的数据集:

每个项目都有唯一的ID和其父项的唯一ID。每个父母可以有一个或多个孩子,每个孩子可以有一个或多个自己的孩子,达到n级,即数据具有上翘的树状结构。虽然它有可能继续无限,但实际上10级的深度是不寻常的,因为在每个级别都有超过10个兄弟姐妹。

对于我要显示的数据集中的每个项目,显示此项目为其父项目的所有项目......依此类推,直至到达数据集的底部。

前两个级别很容易,但我不确定如何有效地在级别之间进行递归。

任何指针都非常赞赏。

4 个答案:

答案 0 :(得分:1)

您是说每个项目仅保留对其父母的引用?如果是这样,那么

def getChildren(item) :
    children = []
    for possibleChild in allItems :
        if (possibleChild.parent == item) :
            children.extend(getChildren(possibleChild))
    return children

这将返回一个列表,其中包含以某种方式来自项目的所有项目。

答案 1 :(得分:1)

如果你想保留数据集的结构,这将产生格式列表[id,[id的子项],id2,[id2的子项]]

def children(id):                                                                         
    return [id]+[children(x.id) for x in filter(lambda x:x.parent == id, items)]

答案 2 :(得分:1)

你应该使用defaultdictionary:

from collections import defaultdict    

itemdict = defaultdict(list)
for id, parent_id in itemlist:
   itemdict[parent_id].append(id)

然后你可以递归打印它(带缩进),如

def printitem(id, depth=0):
    print '  '*depth, id
    for child in itemdict[id]:
        printitem(child, depth+1)

答案 3 :(得分:0)

这样的事情怎么样,


#!/usr/bin/python                                                                                                            

tree = { 0:(None, [1,2,3]),
         1:(0, [4]),
         2:(0, []),
         3:(0, [5,6]),
         4:(1, [7]),
         5:(3, []),
         6:(3, []),
         7:(4, []),
         }

def find_children( tree, id ):
    print "node:", id, tree[id]
    for child in tree[id][1]:
        find_children( tree, child )

if __name__=="__main__":
    import sys
    find_children( tree, int(sys.argv[1]) )

$ ./tree.py 3
node: 3 (0, [5, 6])
node: 5 (3, [])
node: 6 (3, [])

值得注意的是,python的默认递归限制非常低,我认为是1000。

如果您的树实际上变得非常深,那么您很快就会遇到这种情况。 您可以使用

进行调整

sys.setrecursionlimit(100000)

并检查,


sys.getrecursionlimit()