0

我的树构建工具喜欢二叉树。为了获得这样的树,它通常会引入超小的分支以将其保持在二进制结构中。

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

如果分支长度小于指定限制,是否有使用 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 叶子 - 但我未能将它们连接到上节点。

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

如果没有,我应该如何解决这个问题?

非常感谢你,

最好的,

吨。

4

1 回答 1

0

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

for node in t1.get_descendants():
    if not node.is_leaf() and node._dist <= limit:
        node.delete()

可以。

于 2022-02-18T15:56:52.700 回答