1
我有b * inary樹 *其中只有葉子有字符串值(A,B,C,d,E) 我想C * oncatenate的這些葉子的值,並把它傳遞給他們的祖先 *蟒蛇ete2二叉樹得到後人的和值
0
/ \
2 3
/\ /\
1 a d e
/\
b c
如。
1->value=bc 2->value=abc 3->value=de
什麼是蟒蛇藉此在此提前
我有b * inary樹 *其中只有葉子有字符串值(A,B,C,d,E) 我想C * oncatenate的這些葉子的值,並把它傳遞給他們的祖先 *蟒蛇ete2二叉樹得到後人的和值
0
/ \
2 3
/\ /\
1 a d e
/\
b c
如。
1->value=bc 2->value=abc 3->value=de
什麼是蟒蛇藉此在此提前
一個非常標準的程序ete2 tree class
由於是使用後序迭代的最好方式。另外,ETE也實現了get_cached_content函數,這有利於這種類型的計算。
from ete2 import Tree
t = Tree("(((b,c), a), (d,e));")
print "Method 1: caching node content"
internal_node_content = t.get_cached_content(store_attr="name")
for node, content in internal_node_content.iteritems():
if not node.is_leaf():
print node, "\nConcat:", ''.join(content)
print "Method 2: post order iteration"
node2concat = {}
for node in t.traverse("postorder"):
if not node.is_leaf():
concat = ''.join([node2concat[ch] for ch in node.children])
node2concat[node] = concat
print node, "\nConcat:", concat
else:
node2concat[node] = node.name
#Method 1: caching node content
#
# /-b
# /-|
# /-| \-c
# | |
#--| \-a
# |
# | /-d
# \-|
# \-e
#Concat: acbed
#
# /-b
#--|
# \-c
#Concat: cb
#
# /-b
# /-|
#--| \-c
# |
# \-a
#Concat: acb
#
# /-d
#--|
# \-e
#Concat: ed
#Method 2: post order iteration
#
# /-b
#--|
# \-c
#Concat: bc
#
# /-b
# /-|
#--| \-c
# |
# \-a
#Concat: bca
#
# /-d
#--|
# \-e
#Concat: de
#
# /-b
# /-|
# /-| \-c
# | |
#--| \-a
# |
# | /-d
# \-|
# \-e
#Concat: bcade