Как преобразовать словарь Python в формат формы Newick? - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть словарь Python в следующей форме:

{
    'a': {'leaf1': 12, 'leaf2': 32},
    'b': {'a': 2, 'leaf3': 21, 'leaf4': 3},
    'c': {'leaf5': 5, 'leaf6': 7}
}

, где 'a', 'b', 'c' - внутренние узлы, а leaf1 ... leaf6 - листузлы (не имеют дочерних элементов), а 12, 32, 2, 21, ... 7 являются длинами ветвей данного узла или поддерева.

Мне нужнопреобразовать этот словарь в форму Newick, чтобы нарисовать дерево с помощью внешних приложений.

Формат Newick:

(((leaf1:12,leaf2:32):2,leaf3:21, leaf4:3),leaf5:5,leaf6:7);

Я написал следующий код, но безуспешно:

def get_newick(self,dic):      
        roots=[node for node,children in dic.items() if sum([1 if len(child)>1 else 0 for child in children.keys()])==len(children.keys())]                       
        nonrooted=[node for node,children in dic.items() if sum([1 if len(child)>1 else 0 for child in children.keys()])!=len(children.keys())]        
        dic1={}
        for subtree in nonrooted:
            patt=[]
            for child,v in dic[subtree].items():
                if child in roots:
                    patt.append(tuple(["%s:%d"%(k,v) for k,v in dic[child].items()]))
                    roots.remove(child)
                elif len(child)>1:
                    patt.append("%s:%d"%(child,v))
            dic1[subtree]=patt         
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...