2016-07-09 4 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 


Как получить такие вложенные списки?

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) 
  • результат
    nestedList1: [[['bb1'], [['aa3'], 'aa1', 'aa2'], 'aa', 'bb'], 'root']
    nestedList2: [[['cc1'], [[['bb4'], 'bb2', 'bb3'], 'bb1'], [['aa3'], 'aa1', 'aa2'], 'aa', 'bb', 'cc'], 'root']

Все, что я хочу, это ниже результаты.

  • результат
    nestedList1: [[[['aa3'], 'aa1', 'aa2'], 'aa', ['bb1'], 'bb'], 'root']
    nestedList2: [[[['aa3'], 'aa1', 'aa2'], 'aa', [[['bb4'], 'bb2', 'bb3'], 'bb1'], 'bb', ['cc1'], 'cc'], 'root']

Как получить такой вложенный список? Я хочу вложенный список, заказанный постобработку.

+0

Возможно, будет лучше, если каждая ветвь будет зашифрована в скобках, то есть 'nestedList1 = ['root', ['aa', ['aa1', ['aa3']], ['aa2']], [ 'bb', ['bb1']]] 'Тогда вы можете рекурсивно перенести первый элемент в конец. Однако, если вы хотите убедиться, что с самой глубокой режущей ветвью требуется больше манипуляции. ' – Aguy

ответ

2

В общем, что вам нужно сделать, чтобы изменить порядок списка: всякий раз, когда n-й элемент является меткой, а элемент n+1-го является подспиской, поменяйте их. Вы можете сделать это на месте в несколько линии:

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] 

Для решений не на месте, вы можете просто создать глубоководную копию списка, а затем использовать его на копии ,

0

Возможно, я не в строю, или полностью не пропущу точку, но я буду рисковать утверждать, что, я думаю, будет легче, если вы соберете каждую ветвь полностью в скобки. то есть написать каждую ветвь в качестве отличительного [корень, [branch1], [branch2], ...]

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

Тогда вы можете просто рекурсивно изменить порядок, чтобы сделать каждую ветвь листья-1-ый, 2-ой магистрали.

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 

Результаты на модифицированных nestedlists:

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'] 

Является ли это то, что вы были после?

Поиск того, какая ветка глубже для хорошего графика, - это другая тема.