首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >超短枝“清洁”ete3树

超短枝“清洁”ete3树
EN

Stack Overflow用户
提问于 2022-02-18 14:38:39
回答 1查看 54关注 0票数 0

我的建树工具喜欢二叉树。为了得到这样的树,它经常引入超小的分支来保持它的二元结构。

当我试图比较树木时,这对我来说是非常烦人的,因为那些小树枝引入了不应该存在的分裂。

如果树枝长度小于指定的限制,是否有一种简单的方法使用ete3 (或其他库)来清理分支树?

例如,让从根到AB的分支长度小于限制:

代码语言:javascript
复制
      /-A
   /-|
  |   \-B
--|
  |     /-C
   \---|
        \-D

那么生成的树应该如下所示:

代码语言:javascript
复制
   /-A
  |
  |--B
--|
  |     /-C
   \---|
        \-D

我试过这样做:

代码语言:javascript
复制
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)

导致这棵树:

代码语言:javascript
复制
        /-C
-- /---|
        \-D

所以我设法切断了A和B的叶子,但是我没有把它们附加到上面的节点上。

这是一个实现这一目标的有效策略吗?

若否,我应如何处理这个问题?

提前谢谢你,

最好的

t.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-18 15:56:52

哦,这比预期要容易得多:

代码语言:javascript
复制
for node in t1.get_descendants():
    if not node.is_leaf() and node._dist <= limit:
        node.delete()

就这么做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71175253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档