2012-01-18 1 views
0

J'ai une liste plate, par exemple:Comment construire une liste imbriquée à partir d'une liste plate en Python?

flat = ['1', '1-1', '1-1-1', '1-2', '2', '2-1', '2-2', '3'] 

que je dois convertir à une liste imbriquée, où chaque niveau (tiret suivi d'un numéro) commence une nouvelle sous-liste, par exemple:

result = ['1', ['1-1', ['1-1-1'], '1-2'], '2', ['2-1', '2-2'], '3'] 

Des astuces pour faire ça en Python?

+3

Avez-vous Google "Profondeur-First Search" encore? Ce sera difficile à faire avec les protestations de SOPA. Mais vous devriez lire attentivement ce que vous pouvez sur la profondeur en premier. Aussi. S'il s'agit de devoirs, merci de bien le marquer –

+0

Je ferai la lecture sur Depth-First Search et 'itertools'. Je vous remercie. – user1156980

Répondre

4
def nested(flat, level=0): 
    for k, it in itertools.groupby(flat, lambda x: x.split("-")[level]): 
     yield next(it) 
     remainder = list(nested(it, level + 1)) 
     if remainder: 
      yield remainder 

Exemple:

>>> list(nested(flat, 0)) 
['1', ['1-1', ['1-1-1'], '1-2'], '2', ['2-1', '2-2'], '3'] 
Questions connexes