Python:从父子关系计算路径

Cam*_*art 1 python tree parent

父)作为 csv(700,000 行)输入

Child   Parent
fA00    f0
fA9 fA0
fA31    fA0
fA30    fA0
fA1 fA00
dccfA1  fA00
fA2 fA00
fA3 fA00
fA01    fA00
fA4 fA00
fA5 fA00
fA6 fA00
fA7 fA00
fA0 fA00
fA142149    fA00
fA02    fA00
fA8 fA00
qA1 fA10
fA22    fA10
fA23    fA10
fA11    fA10
qA2     fA10
fA15    fA11
fA13    fA11
fA12    fA11
fA14    fA13
fA17    fA16
fA18    fA17
fA19    fA17
fA20    fA17
fA21    fA19
etc....
Run Code Online (Sandbox Code Playgroud)

它上升到 14 级深。顶级父级是 f0

我想遍历子父关系以确定路径

预期结果

f0 --- top
f0\fa00
f0\fa00\.Child
f0\fa00\.Child2etc
f0\fA0
f0\fA0\.Child
f0\fA0\.Child2etc
Run Code Online (Sandbox Code Playgroud)

我怎样才能在 Python 中做到这一点?

Mik*_*ins 5

我开始考虑树结构的复杂递归构造,但基本上它非常简单。创建子级到父级的映射,然后从子级开始,列出其父级,然后是父级的父级,直到顶部。递归程序很容易提取孩子的祖先。

'''
This is the family tree:
------------------------
f0:
    a0:
        b0
        b1:
        b2:
    a1:
        b3:
        b4:
    a2:
        b5:
            c0
            c1
'''
ancestry = [
    ('b1', 'a0'),
    ('c1', 'b5'),
    ('b2', 'a0'),
    ('b3', 'a1'),
    ('b4', 'a1'),
    ('b5', 'a2'),
    ('a0', 'f0'),
    ('a1', 'f0'),
    ('a2', 'f0'),
    ('b0', 'a0'),
    ('c0', 'b5'),
]
Run Code Online (Sandbox Code Playgroud)

代码是:

parents = set()
children = {}
for c,p in ancestry:
    parents.add(p)
    children[c] = p

# recursively determine parents until child has no parent
def ancestors(p):
    return (ancestors(children[p]) if p in children else []) + [p]

# for each child that has no children print the geneology
for k in (set(children.keys()) - parents):
    print '/'.join(ancestors(k))
Run Code Online (Sandbox Code Playgroud)

输出是:

f0/a1/b4
f0/a0/b0
f0/a0/b1
f0/a0/b2
f0/a1/b3
f0/a2/b5/c1
f0/a2/b5/c0
Run Code Online (Sandbox Code Playgroud)

我将把它作为阅读 csv 文件的练习,也许可以更好地对输出进行排序。