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


Làm thế nào để có được một danh sách lồng nhau?

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) 
  • kết quả
    nestedList1: [[['bb1'], [['aa3'], 'aa1', 'aa2'], 'aa', 'bb'], 'root']
    nestedList2: [[['cc1'], [[['bb4'], 'bb2', 'bb3'], 'bb1'], [['aa3'], 'aa1', 'aa2'], 'aa', 'bb', 'cc'], 'root']

Tất cả tôi muốn là kết quả dưới đây.

  • kết quả
    nestedList1: [[[['aa3'], 'aa1', 'aa2'], 'aa', ['bb1'], 'bb'], 'root']
    nestedList2: [[[['aa3'], 'aa1', 'aa2'], 'aa', [[['bb4'], 'bb2', 'bb3'], 'bb1'], 'bb', ['cc1'], 'cc'], 'root']

Làm thế nào để có được một danh sách lồng nhau như vậy? Tôi muốn một danh sách lồng nhau, được đặt hàng để duyệt qua theo thứ tự.

+0

Có thể sẽ tốt hơn nếu mỗi nhánh sẽ được encaplsulated trong ngoặc đơn nghĩa là 'nestedList1 = ['root', ['aa', ['aa1', ['aa3']], ['aa2']], [ 'bb', ['bb1']]] 'Sau đó, bạn có thể đệ quy di chuyển mục đầu tiên đến cùng. Tuy nhiên, nếu bạn muốn chắc chắn với nhánh cắt sâu nhất thì cần phải thao tác nhiều hơn. ' – Aguy

Trả lời

2

Về cơ bản, bạn cần làm gì để sắp xếp lại danh sách: Bất cứ khi nào yếu tố thứ n là nhãn và phần tử n+1 là danh sách phụ, hãy trao đổi hai. Bạn có thể làm điều này tại chỗ trong một vài dòng:

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] 

Đối với một giải pháp không tại chỗ, bạn chỉ có thể tạo ra một sâu bản sao của danh sách và sau đó sử dụng trên các bản sao .

0

Tôi có thể ở ngoài hàng ở đây hoặc hoàn toàn thiếu điểm, nhưng tôi sẽ mạo hiểm tuyên bố rằng tôi nghĩ rằng sẽ dễ dàng hơn nếu bạn thu thập từng chi nhánh đầy đủ vào dấu ngoặc đơn. ví dụ: viết từng ngành như một biệt [root, [branch1], [branch2], ...]

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

Sau đó, bạn có thể chỉ cần đệ quy thay đổi thứ tự để làm cho mỗi chi nhánh lá-1, cốp-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 

Các kết quả trên nestedlists chỉnh sửa:

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

Đây có phải là những gì bạn đang theo đuổi?

Tìm nhánh nào sâu hơn cho âm mưu đẹp là một chủ đề khác.

Các vấn đề liên quan