我的建树工具喜欢二叉树。为了得到这样的树,它经常引入超小的分支来保持它的二元结构。
当我试图比较树木时,这对我来说是非常烦人的,因为那些小树枝引入了不应该存在的分裂。
如果树枝长度小于指定的限制,是否有一种简单的方法使用ete3 (或其他库)来清理分支树?
例如,让从根到AB的分支长度小于限制:
/-A
/-|
| \-B
--|
| /-C
\---|
\-D那么生成的树应该如下所示:
/-A
|
|--B
--|
| /-C
\---|
\-D我试过这样做:
from ete3 import Tree
tree = "((A:0.1,B:0.2):0.005,(C:0.3,D:0.4):0.009);"
t1 = Tree(tree, quoted_node_names=True, format=1)
limit = 0.006
for node in t1.iter_descendants():
if node.dist <= limit:
nn = node._children
nodelist = []
for n in nn:
nodelist.append(n.name)
for n in nodelist:
parent = node.up
remove = t1.search_nodes(name=n)
remove[0].delete()
# parent._children.append(remove)
print(t1)导致这棵树:
/-C
-- /---|
\-D所以我设法切断了A和B的叶子,但是我没有把它们附加到上面的节点上。
这是一个实现这一目标的有效策略吗?
若否,我应如何处理这个问题?
提前谢谢你,
最好的
t.
发布于 2022-02-18 15:56:52
哦,这比预期要容易得多:
for node in t1.get_descendants():
if not node.is_leaf() and node._dist <= limit:
node.delete()就这么做。
https://stackoverflow.com/questions/71175253
复制相似问题