2017-03-16 7 views
0

私は任意の長さの0と1の文字列を置換しようとしています。私は長さnの文字列の結果がn=3のようになるように、このトピックに関する多くの答えを見ました。Pythonでは、順番に0と1の文字列のすべての順列を生成するにはどうすればよいですか?

000 
001 
010 
011 
100 
101 
110 
111 

これは私が必要なものではありません!

私はそれが長さ3のために、このようにする必要が

000 
100 
010 
001 
110 
101 
011 
111 

長さ4の場合、これは次のようになります。

0000 
1000 
0100 
0010 
0001 
1100 
1010 
1001 
0110 
0101 
0011 
1110 
1101 
1011 
0111 
1111 

長さ5の場合、それは次のようになります。

00000 
10000 
01000 
00100 
00010 
00001 
11000 
10100 
10010 
10001 
01100 
01010 
01001 
00110 
00101 
00011 
11100 
11010 
11001 
10110 
10101 
10011 
01110 
01101 
01011 
00111 
11110 
11101 
11011 
10111 
01111 
11111 

など。

私はちょうどf誰かが私を助けることができる、このためのアルゴリズムをigure?

編集:私はこのサイトのどこかで答えを見つけることができたことを示唆しています。私はここに新しいので、私は正しく理解できないかもしれませんが、私は2つの質問で見た唯一の重複は単語順列でした。

答えて

0

これは私のために働く。しかし、要素を順番に生成するのではなく、まず要素を生成して並べ替えます。

n = 5 
i = np.array(np.indices(n * (2,))).reshape(n, -1) 
i[:, np.argsort(i.sum(0)[::-1], kind='mergesort')].T[::-1] 

安定したソート、同点の場合には元の順序を保存する、すなわちいずれかを使用して、それらの数字の和でバイナリワードをソート。順序で単語を生成

溶液をitertools

itertools.chain((n*(0,),), (l[0] * (0,) + sum(((1,) + (i-j-1) * (0,) for i, j in zip(l[1:], l[:-1])),()) + (1,) + (n-l[-1]-1)*(0,) for k in range(1,n+1) for l in itertools.combinations(range(n), k))) 

で構成することができるこれはものKK = 0特殊ケーシングとitertools.chainを使用して付加されている)の数をループ。各Kことは全てK要素サブセットセットのリットル `{0、1、...、N -1}作成するitertools.combinationsを使用してバイナリワードに各サブセットを変換します。この変換は、lの要素ごとに1を入れ、その間にいくつのゼロを入れなければならないかを計算することによって機能します。先頭と末尾の0は特殊なケースにする必要がありました。

出力例:numpy

# array([[0, 0, 0, 0, 0], [1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], 
     [0, 0, 0, 1, 0], [0, 0, 0, 0, 1], [1, 1, 0, 0, 0], [1, 0, 1, 0, 0], 
     [1, 0, 0, 1, 0], [1, 0, 0, 0, 1], [0, 1, 1, 0, 0], [0, 1, 0, 1, 0], 
     [0, 1, 0, 0, 1], [0, 0, 1, 1, 0], [0, 0, 1, 0, 1], [0, 0, 0, 1, 1], 
     [1, 1, 1, 0, 0], [1, 1, 0, 1, 0], [1, 1, 0, 0, 1], [1, 0, 1, 1, 0], 
     [1, 0, 1, 0, 1], [1, 0, 0, 1, 1], [0, 1, 1, 1, 0], [0, 1, 1, 0, 1], 
     [0, 1, 0, 1, 1], [0, 0, 1, 1, 1], [1, 1, 1, 1, 0], [1, 1, 1, 0, 1], 
     [1, 1, 0, 1, 1], [1, 0, 1, 1, 1], [0, 1, 1, 1, 1], [1, 1, 1, 1, 1]]) 

itertools

list(_) 
# [(0, 0, 0, 0, 0), (1, 0, 0, 0, 0), (0, 1, 0, 0, 0), (0, 0, 1, 0, 0), (0, 0, 0, 1, 0), (0, 0, 0, 0, 1), 
    (1, 1, 0, 0, 0), (1, 0, 1, 0, 0), (1, 0, 0, 1, 0), (1, 0, 0, 0, 1), (0, 1, 1, 0, 0), (0, 1, 0, 1, 0), 
    (0, 1, 0, 0, 1), (0, 0, 1, 1, 0), (0, 0, 1, 0, 1), (0, 0, 0, 1, 1), (1, 1, 1, 0, 0), (1, 1, 0, 1, 0), 
    (1, 1, 0, 0, 1), (1, 0, 1, 1, 0), (1, 0, 1, 0, 1), (1, 0, 0, 1, 1), (0, 1, 1, 1, 0), (0, 1, 1, 0, 1), 
    (0, 1, 0, 1, 1), (0, 0, 1, 1, 1), (1, 1, 1, 1, 0), (1, 1, 1, 0, 1), (1, 1, 0, 1, 1), (1, 0, 1, 1, 1), 
    (0, 1, 1, 1, 1), (1, 1, 1, 1, 1)] 
+0

ありがとうございました!私は明日コンピュータをもう一度持っているときにこの最初のことを試してみるつもりです:)私は今、私の電話にいます。 –

+0

itertoolsコードについて説明できますか?私はn = 40とkの範囲(1,2)にしようとしています。これはちょうど41の本当の基本ベクトルを与えるべきですが、何らかの理由でそれは永遠にかかります。最適化を手伝ってもらえますか? –

+0

@ Perm.Questiin私は 'n = 40、k(1、2)'の範囲で試してみました。結果にリストを適用しましたか?コードをもっとうまく説明できる方法を見ていきます。 –

関連する問題