Python:从父子关系计算路径

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:从父子关系计算路径相关的知识,希望对你有一定的参考价值。

父)作为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....

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

我想迭代子父关系来确定路径

预期结果

f0 --- top
f0fa00
f0fa00.Child
f0fa00.Child2etc
f0fA0
f0fA0.Child
f0fA0.Child2etc

我怎么能用Python做到这一点?

答案

我开始考虑复杂的tree structures递归构造,但基本上它非常简单。创建一个子到父的映射,然后从子列表开始,父子列表,父节点的父节点到顶部。递归例程很容易提取孩子的祖先。

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

代码是:

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

输出是:

f0/a1/b4
f0/a0/b0
f0/a0/b1
f0/a0/b2
f0/a1/b3
f0/a2/b5/c1
f0/a2/b5/c0

我将把它作为练习留给read the csv file,并且可能更好地对输出进行排序。

以上是关于Python:从父子关系计算路径的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查询父子关系

用java代码将从数据库中取出的具有父子关系的数据转成json格式

Python - 模块

使用 MagicalRecord 从 JSON 中保存父子关系

linux shell脚本获取脚本目录时,$(dirname “${BASH_SOURCE[0]}“)与$(dirname $0)有什么区别?(脚本路径,脚本包含关系,父子脚本)

linux shell脚本获取脚本目录时,$(dirname “${BASH_SOURCE[0]}“)与$(dirname $0)有什么区别?(脚本路径,脚本包含关系,父子脚本)