Python 构建系统发生树

Python 构建系统发生树,python,tree,bioinformatics,phylogeny,Python,Tree,Bioinformatics,Phylogeny,我有一张这样的清单 matches = [[['rootrank', 'Root'], ['domain', 'Bacteria'], ['phylum', 'Firmicutes'], ['class', 'Clostridia'], ['order', 'Clostridiales'], ['family', 'Lachnospiraceae'], ['genus', 'Lachnospira']], [['rootrank', 'Root'], ['domain',

我有一张这样的清单

matches = [[['rootrank', 'Root'], ['domain', 'Bacteria'], ['phylum', 'Firmicutes'], ['class', 'Clostridia'], ['order', 'Clostridiales'], ['family', 'Lachnospiraceae'], ['genus', 'Lachnospira']], 
           [['rootrank', 'Root'], ['domain', 'Bacteria'], ['phylum', '"Proteobacteria"'], ['class', 'Gammaproteobacteria'], ['order', '"Vibrionales"'], ['family', 'Vibrionaceae'], ['genus', 'Catenococcus']], 
           [['rootrank', 'Root'], ['domain', 'Archaea'], ['phylum', '"Euryarchaeota"'], ['class', '"Methanomicrobia"'], ['order', 'Methanomicrobiales'], ['family', 'Methanomicrobiaceae'], ['genus', 'Methanoplanus']]]
我想用它们构建一个系统发育树。我编写了一个这样的节点类(部分基于):

然后我试着像这样构建我的树:

node = None
for match in matches:
    for branch in match:
        category, name = branch
        node = Node(node, category, name)
        print [n.ID() for n in node.fullPath()]

这适用于第一个匹配,但当我从第二个匹配开始时,它会附加到树的末尾,而不是从树的顶部重新开始。我该怎么做?我尝试了一些搜索ID的变体,但无法使其工作。

问题是
节点始终是树中最底部的节点,并且您总是附加到该节点。您需要存储根节点。由于
['rootrank','Root']
出现在每个列表的开头,我建议将其拉出并用作根。因此,您可以执行以下操作:

rootnode = Node(None, 'rootrank', 'Root')
for match in matches:
    node = rootnode
    for branch in match:
        category, name = branch
        node = Node(node, category, name)
        print [n.ID() for n in node.fullPath()]

这将使
匹配项
列表更具可读性,并提供预期的输出。

帮你自己一个忙,不要重新发明轮子。完成您在这里要求的所有内容以及接下来要问的大部分内容。

我强烈建议您使用类似的系统发育库

“编写系统发育树的标准方法是使用Newick格式(插入语句,如((A,B),C))。如果你使用树状图,阅读那棵树就很简单了

>>> import dendropy
>>> tree1 = dendropy.Tree.get_from_string("((A,B),(C,D))", schema="newick")
或者从一个流中读取

>>> tree1 = dendropy.Tree(stream=open("mle.tre"), schema="newick")
图书馆的创造者也保持着一个良好的形象

>>> tree1 = dendropy.Tree(stream=open("mle.tre"), schema="newick")