Bonjour,

J'ai l'arbre de Newick suivant :

"((((A,B)1,C)2,((((D,E)3,F)4,G)5,(((((H,I)6,J)7,K)8,L)9,M)10)11)12,N)13;"

où les lettres sont les feuilles et les chiffres les nœuds, le ';' indique la racine et les parenthèses les filiations.


Je souhaite obtenir un dictionnaire qui associe un nœud avec ses deux enfants. Comme ceci : {1:('A','B'),2:('C',1),3:('D','E'),4:('F',3),5:('G',4),6:('H','I'),7:('J',6),8:('K',7),9:('L',8),10:('M',9),11:(10,5),12:(2,11),13:(12,'N')}

J'ai trouvé le code suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import re
 
def parse(newick):
    tokens = re.findall(r"([^;,()\s]*)(?:\s*\s*([\d.]+)\s*)?([,);])|(\S)", newick)
    def recurse():
        children = []
        name, length, delim, ch = tokens.pop(0)
        if ch == "(":
            while ch in "(,":
                node, ch = recurse()
                children.append(node)
            name, length, delim, ch = tokens.pop(0)
        return {"name": name,"children": children}, delim
    return recurse()[0]
qui renvoie l'arbre sous forme d'un dictionnaire mais je ne vois pas comment l'adapter à mon problème.
Merci