2016-07-09 11 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番目の要素がサブリストの場合は、その2つを入れ替えます。あなたは、いくつかのラインでインプレースこのを行うことができます。

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

私はここから外れているかもしれませんが、ポイントを完全に見落としているかもしれませんが、各ブランチを括弧で完全に集めればもっと簡単になると思うでしょう。すなわち、その後、あなただけ再帰的に各ブランチが、トランク・第二・第一を離れるようにするために変更することができます

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

[[BRANCH2]、...、[支社]、ルート]独特として各ブランチを書きます。

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

はあなたが後何であったか、このですか?

素敵なプロットのためにどのブランチが深いかを見つけることは別のトピックです。

関連する問題