2016-07-09 37 views
5
variable tree structure 

- nestedList1 variable 

aa3 
| 
aa1  aa2  bb1 
    \ / /
    aa  bb 
     \ /
     root 

- nestedList2 variable 

       bb4 
       | 
aa3   bb2  bb3 
|    \ /
aa1  aa2  bb1 cc1 
    \ / /  | 
    aa  bb   cc 
     \  |  /
       root 


Come ottengo tali elenchi annidati?

nestedList1 = ['root', ['aa', ['aa1', ['aa3'], 'aa2'], 'bb', ['bb1']]] 
nestedList2 = ['root', ['aa', ['aa1', ['aa3'], 'aa2'], 'bb', ['bb1', ['bb2', ['bb4'], 'bb3']], 'cc', ['cc1']]] 

def ConvertTraverse(nlist, depth=0): 
    convertlist = [] 
    for leaf in nlist: 
     if isinstance(leaf, list): 
      tmplist = ConvertTraverse(leaf, depth+1) 
      convertlist.insert(0, tmplist) 
     else: 
      convertlist += [leaf] 
    return convertlist 

print ConvertTraverse(nestedList1) 
print ConvertTraverse(nestedList2) 
  • risultato
    nestedList1: [[['bb1'], [['aa3'], 'aa1', 'aa2'], 'aa', 'bb'], 'root']
    nestedList2: [[['cc1'], [[['bb4'], 'bb2', 'bb3'], 'bb1'], [['aa3'], 'aa1', 'aa2'], 'aa', 'bb', 'cc'], 'root']

Tutto quello che voglio è i risultati qui sotto.

  • risultato
    nestedList1: [[[['aa3'], 'aa1', 'aa2'], 'aa', ['bb1'], 'bb'], 'root']
    nestedList2: [[[['aa3'], 'aa1', 'aa2'], 'aa', [[['bb4'], 'bb2', 'bb3'], 'bb1'], 'bb', ['cc1'], 'cc'], 'root']

Come posso ottenere una lista come annidata? Desidero un elenco annidato, ordinato per attraversare l'ordine.

+0

Forse sarebbe meglio se ogni ramo fosse racchiuso tra parentesi cioè 'nestedList1 = ['root', ['aa', ['aa1', ['aa3']], ['aa2']], [ 'bb', ['bb1']]] 'Quindi puoi spostare ricorsivamente il primo oggetto fino alla fine. Tuttavia, se vuoi essere sicuro con il ramo di taglio più profondo, è necessaria una maggiore manipolazione. ' – Aguy

risposta

2

In pratica, cosa è necessario fare per riordinare l'elenco: Ogni volta che l'elemento n è un'etichetta e l'elemento n+1 è un sottolista, scambiare i due. È possibile farlo sul posto in pochi riga:

def reorder(lst): 
    for i, (cur, nxt) in enumerate(zip(lst, lst[1:])): 
     if isinstance(cur, str) and isinstance(nxt, list): 
      reorder(nxt) 
      lst[i:i+2] = [nxt, cur] 

Per un non-in-place soluzione , si può semplicemente creare una profonda copia della lista e quindi utilizzare tale sulla copia .

0

Potrei essere fuori linea qui, o mancare completamente il punto, ma mi azzarderò a sostenere che penso che sarà più facile se raccoglierai ogni ramo completamente tra parentesi. vale a dire scrivere ogni ramo come un distintivo [root, [Branch1], [Branch2], ...]

nestedList1 = ['root', ['aa', ['aa1', ['aa3']], ['aa2']], ['bb', ['bb1']]] 
nestedList2 = ['root', ['aa', ['aa1', ['aa3']], ['aa2']], ['bb', ['bb1', ['bb2', ['bb4']], ['bb3']]], ['cc', ['cc1']]] 

allora si può solo cambiare in modo ricorsivo il fine di rendere ogni filiale fogli-1 °, 2 ° tronco-.

def recursivereverese(l): 
    if len(l)<=1 or type(l) is not list: 
     return l 
    else: 
     new = [] 
     for k in l[::-1]: 
      new.append(recursivereverese(k)) 
     return new 

i risultati sul nestedlists modificati:

In [127]: recursivereverese(nestedList1) 
Out[127]: [[['bb1'], 'bb'], [['aa2'], [['aa3'], 'aa1'], 'aa'], 'root'] 

In [128]: recursivereverese(nestedList2) 
Out[128]: 
[[['cc1'], 'cc'], 
[[['bb3'], [['bb4'], 'bb2'], 'bb1'], 'bb'], 
[['aa2'], [['aa3'], 'aa1'], 'aa'], 
'root'] 

'questo quello che erano dopo?

Trovare quale ramo è più profondo per un buon disegno è un argomento diverso.