たとえば、[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']
のおかげです。私は質問を編集しました。 – ddas