У меня есть словарь 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