2017-09-16 3 views
0

リストはです。可能な限りリストの要素間に最大でlen(mylist)+1要素の番号を挿入したい。出力は、これらのようなもの、リストの要素の間に、リスト内のすべての可能な方法で新しい要素を挿入してください。

[1, 2]  

['A', 1, 2] 
[1, 'A', 2] 
[1, 2, 'A'] 

['A', 1,'A', 2] 
['A',1, 2, 'A'] 
[1, 'A', 2,'A'] 

['A', 1,'A', 2, 'A'] 

は、これまでのところ、私はすべての可能な方法で、リスト内の唯一の「A」を挿入することができていなければなりません。ここに私のコードは、

m = 3  
mylist = list(range(1,m))  
for j in range (len(mylist)+1): 
    newlist = mylist[:j] + ['A'] + mylist[j:] 
    print(newlist) 

あり、出力は、私は、リストの要素の間に2つの「A」を挿入しなければならないとき、私は、次の手順で立ち往生しています、

['A', 1, 2] 
[1, 'A', 2] 
[1, 2, 'A'] 

です。助けが必要。

+0

のおかげです。私は質問を編集しました。 – ddas

答えて

2

たとえば、[1,2]のようにリストを作成し、要素間のスペースを考慮してください。この例では2つの要素があるため、3つのスペースがあります。それらを0, 1, 2と呼ぶことにしましょう。あなたはそれらのスペースにあなたの手紙'A'を置きたいと思う。あなたがそう言っているわけではありませんが、あなたの例から、たった1文字が各スペースに入るということが出ているので、繰り返しはありません。

したがって、セット{0, 1, 2}の可能なすべてのサブセットを取得する必要があります。それらのセットのそれぞれについて、そのセットのそのスペースに手紙'A'を置きます。

すべてのサブセットのセットを「パワーセット」といいます。 Pythonにはそれが組み込まれているわけではありませんが、いくつかの方法があります。ここには、itertools組み込みモジュールを使用する1つの方法があります。

import itertools 

def powerset(iterable): 
    "powerset([1,2,3]) -->() (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" 
    s = list(iterable) 
    return itertools.chain.from_iterable(combinations(s, r) for r in range(len(s)+1)) 

リストにあなたの'A'秒を挿入するために、各セットを使用し、その後、スペースのあなたのセットを取得するために使用。

リストのグループ間で出力に空白行を実際に追加する場合は、itertools.combinations(s, r)関数を直接使用することをお勧めします。これにより、rのセットsのすべてのサブセットが得られます。ループをr以上にして結果のリストを印刷し、各値の後に空白行を印刷します。rあなたが望む特定の出力が与えられれば、これはおそらく最良の選択肢です。

powersetを取得するもう1つの方法はFiniteSetクラスのpowerset()メソッドを使用します。sympyです。 sympyモジュールは、Pythonの標準的な部分ではありませんが、Anacondaインストールを使用してPythonをインストールした場合は、すでにインストール済みです。

powersetを取得するさらに別の方法は、独自の再帰的またはバックトラッキングルーチンを作成することです。これは最も難しい方法ですが、これはモジュールの使用を避けます。

itertools.combinationsを直接使用して、「最良のオプション」を実装するコードです。より良い名前と内容を持つように変数を変更しました。

from itertools import combinations 

mylistsize = 2 
myinsertitem = 'A' 
mylist = list(range(1, mylistsize+1)) 

allspaceplaces = list(range(mylistsize+1)) 
for numinserts in range (mylistsize + 2): 
    if numinserts: 
     print() 
    for spaceplaces in combinations(allspaceplaces, numinserts): 
     newlist = [] 
     lo = 0 
     for hi in spaceplaces: 
      newlist.extend(mylist[lo:hi]) 
      newlist.append(myinsertitem) 
      lo = hi 
     newlist.extend(mylist[lo:]) 
     print(newlist) 

そのコードからプリントアウトは、このアドバイスを

[1, 2] 

['A', 1, 2] 
[1, 'A', 2] 
[1, 2, 'A'] 

['A', 1, 'A', 2] 
['A', 1, 2, 'A'] 
[1, 'A', 2, 'A'] 

['A', 1, 'A', 2, 'A'] 
+0

あなたはきれいに説明しています。私はそれらの空白行は必要ありません。私もitertoolsで試していたが、目標に到達できなかった。ご協力いただきありがとうございます :) – ddas

関連する問題