构建phylogenti

2024-03-29 12:20:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张这样的单子

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']]]

我想从中构建一个系统进化树。我编写了这样一个节点类(部分基于this code):

^{pr2}$

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

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()]

这适用于第一个匹配项,但是当我从第二个匹配项开始时,它将被追加到树的末尾,而不是再次从顶部开始。我该怎么做?我尝试了一些不同的方法来搜索身份证,但是我无法使它起作用。在


Tags: inbranchnodefordomainmatchorderroot
3条回答

问题是node始终是树中最底部的节点,而您总是将其附加到该节点。您需要存储根节点。由于['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()]

这将使matches列表更具可读性,并给出预期的输出。在

我强烈推荐使用系统发育学库,比如Dendropy。在

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

>>> import dendropy
>>> tree1 = dendropy.Tree.get_from_string("((A,B),(C,D))", schema="newick")

或是从溪流中阅读

^{pr2}$

库的创建者也维护了一个漂亮的tutorial。在

帮你自己一个忙,不要重新发明轮子。Python-graph (a.k.a. pygraph)做你在这里问的所有事情,以及你接下来要问的大部分事情。在

相关问题 更多 >