在python中工作我想提取具有以下结构的数据集:
每个项目都有唯一的ID和其父项的唯一ID。每个父母可以有一个或多个孩子,每个孩子可以有一个或多个自己的孩子,达到n级,即数据具有上翘的树状结构。虽然它有可能继续无限,但实际上10级的深度是不寻常的,因为在每个级别都有超过10个兄弟姐妹。
对于我要显示的数据集中的每个项目,显示此项目为其父项目的所有项目......依此类推,直至到达数据集的底部。
前两个级别很容易,但我不确定如何有效地在级别之间进行递归。
任何指针都非常赞赏。
答案 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()