2011-07-27 19 views
7

私は昨日以来、小さいながらトリッキーな問題に固執しています。Python - ネストされたリストの反復

私は何を持っていることである。このような(多分無限)ネストされたリスト:リストは2つのサブリストで構成され、各レベルで

[1,[2,[3,4]]] 
or [[1,2],[3,4]] and so on. 

、(リストはおそらく、任意の長さを取得しますので、私はタプルを使用していません次のステップで) ここでは、このリスト内のすべての可能な位置に要素を挿入し、すべての可能な挿入位置のリストを返したいとします。 私は5を挿入するのであれば、私の出力は次のようになります。

[ [5,[1,[2,[3,4]]]], 
[1,[5,[2,[3,4]]]], 
[1,[2,[5,[3,4]]]], 
[1,[2,[[3,5],4]]], 
[1,[2,[3,[4,5]]]] ] 

背景:私は、一度に1つの分類群を追加することにより、系統樹を構築しようとしています。各分類群は、最適な位置に挿入する必要があります。私は今だ何

は次のとおりです。私が欲しいの出力を生成し、やや近づいていません

def get_trees(nwklist,newid): 
    if not isinstance(nwklist,list): 
     return [newid,nwklist] 
    else: 
     return [newid,nwklist],[get_trees(nwklist[0],newid),nwklist[1]],[nwklist[0],get_trees(nwklist[1],newid)] 

([5, [1, [2, [3, 4]]]], 
[[5, 1], [2, [3, 4]]], 
[1, ([5, [2, [3, 4]]], [[5, 2], [3, 4]], [2, ([5, [3, 4]], [[5, 3], 4], [3, [5, 4]])])]) 

おそらくラムダ関数を含む簡単な解決策が必要ですが、私はそれを見ません。

クリストフ

+6

あなたはほぼ確実にホイールを再発明しています。 BiopythonのPhylo(http://www.biopython.org/wiki/Phylo)や樹状細胞(http://pypi.python.org/pypi/DendroPy) –

+0

のように、Pythonで系統樹を扱うためのパッケージがあります。リストには*任意の*深さがありますが、*無限*の深さはありません。少なくとも、私はそれがどうなるか分からない。 –

+0

"各分類群は、最適な位置に挿入する必要があります。"これは、悪い計画である、近隣に参加するツリーを構築しようとするように思えます。 phylogentic treesを最もよく構築する方法と、なぜ最も簡単な方法が最悪であるかについて、さらに多くの文献を調べてください。 – pyvi

答えて

2

私は発電機を使用したい:

def gen_trees(nwklist, newid): 
    yield [newid] + [nwklist] 
    if isinstance(nwklist, list): 
    for i in xrange(len(nwklist)): 
     for l in gen_trees(nwklist[i], newid): 
     yield nwklist[:i] + [l] + nwklist[i+1:] 
    yield [nwklist] + [newid] 

for l in gen_trees([1,[2,[3,4]]] , 5): 
    print l 

これはあなたの例に記載されているよりも多くの木を返すことに注意してください:私の知る限り見ることができるように

[5, [1, [2, [3, 4]]]] 
[[5, 1], [2, [3, 4]]] 
[[1, 5], [2, [3, 4]]] 
[1, [5, [2, [3, 4]]]] 
[1, [[5, 2], [3, 4]]] 
[1, [[2, 5], [3, 4]]] 
[1, [2, [5, [3, 4]]]] 
[1, [2, [[5, 3], 4]]] 
[1, [2, [[3, 5], 4]]] 
[1, [2, [3, [5, 4]]]] 
[1, [2, [3, [4, 5]]]] 
[1, [2, [[3, 4], 5]]] 
[1, [[2, [3, 4]], 5]] 
[[1, [2, [3, 4]]], 5] 

を、これは規定の要件に従う。 (例えば、すべてのサブリストの最初の要素がスカラーでなければならない場合など)明らかにされていないいくつかの文句のない要件がある場合は、明確にして解決策を更新します。

+0

ありがとう!それはとてもよく見えます。 それ以上私はリストされているので、順序は重要ではないことを忘れていたので、 [1、[[5,2]、[3,4]] [1、[2、5]、[3 、4]]] は基本的に同じツリーです。 – Christoph

+0

2番目のyield [nwklist] + [newid]行を削除しても、私が望むものを得ることができます。 ありがとうございました! – Christoph

関連する問題