Python: 从父子关系计算路径
Python: Calculating the Path from Parent Child Relationships
父级)作为 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
f0\fa00
f0\fa00\.Child
f0\fa00\.Child2etc
f0\fA0
f0\fA0\.Child
f0\fA0\.Child2etc
如何在 Python 中执行此操作?
我开始考虑 tree structures 的复杂递归构造,但基本上它非常简单。创建 child 到 parent 的映射,然后从 child 列表开始,其 parent 然后 parent 的 parent 一直到顶部。递归例程可以轻松提取 child 的祖先。
'''
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 的练习,也许可以更好地对输出进行排序。
父级)作为 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
f0\fa00
f0\fa00\.Child
f0\fa00\.Child2etc
f0\fA0
f0\fA0\.Child
f0\fA0\.Child2etc
如何在 Python 中执行此操作?
我开始考虑 tree structures 的复杂递归构造,但基本上它非常简单。创建 child 到 parent 的映射,然后从 child 列表开始,其 parent 然后 parent 的 parent 一直到顶部。递归例程可以轻松提取 child 的祖先。
'''
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 的练习,也许可以更好地对输出进行排序。