2016-08-25 11 views
0

数字の集合から派生した3つの数字のすべての可能な組み合わせを生成しようとしています。
私は1から9の数字を(それぞれ1回)14, 983, 7256のような3倍の数字を生成したいと考えています。したがって、すべての桁は一度しか使用できず、すべての桁を使用する必要があります。 '123456789'数字の集合から数値を生成

bin_arr = [] 
for i in range(1, 512): 
    bin_arr.append([int(a) for a in ("{0:0b}".format(i))]) 

>>> bin_arr[257] 
>>> [1, 0, 0, 0, 0, 0, 0, 0, 1] 

compressこれらが、それdoesntのは、どこにでも行くように見える:

私の最初のアイデアはそうのような各番号のプールとして数字の異なるセットを生成することでした。

これを賢明な方法で行う方法はありますか?

+0

が注文の問題をしていますか? '[14、983、7256]は' [983、14、7256] 'とは区別されますか? –

+0

はい。結局、注文は重要です。しかし、もし私がすべてのトリプルを持っていれば、私はそれを後ですることができます。しかし、あなたがトリプルを生成している間にそれを行うことができれば、それはさらに良いでしょう。 – sebastian

答えて

1

私たちは、その後、[私たちは3の後に4次々と他の、それに2つのコンマを追加しますので、我々は数字のトリプルを生成し、数列149832567する[14,983,2567]のように1つのリストを取ることができます14,983,2567]。

したがって、生成できる数字シーケンスの数はいくつですか?

In [1]: import itertools 

In [2]: a = range(1,10) 

In [3]: a 
Out[3]: [1, 2, 3, 4, 5, 6, 7, 8, 9] 

In [4]: len(list(itertools.permutations(a,9))) 
Out[4]: 362880 

我々は?コンビネーションに生成することができますどのように多くのトリプル番号437865192、のような数列を取得すると

8 * 7月2日= 28

(9つの数字の間に2つのギャップを選ぶ)または使用するitertools.combinations

In [8]: len(list(itertools.combinations(list(range(8)),2))) 
Out[8]: 28 

シーケンスを指定すると、28個の組み合わせが得られます。

In [1]: a = ['2','3','6','4','9','1','7','8','5'] 

In [2]: import itertools 

In [4]: for i in itertools.combinations(range(1,9),2): 
...:  print [int(''.join(a[:i[0]])), int(''.join(a[i[0]:i[1]])), int(''.join(a[i[1]:]))] 

[2, 3, 6491785] 
[2, 36, 491785] 
[2, 364, 91785] 
[2, 3649, 1785] 
[2, 36491, 785] 
[2, 364917, 85] 
[2, 3649178, 5] 
[23, 6, 491785] 
[23, 64, 91785] 
[23, 649, 1785] 
[23, 6491, 785] 
[23, 64917, 85] 
[23, 649178, 5] 
[236, 4, 91785] 
[236, 49, 1785] 
[236, 491, 785] 
[236, 4917, 85] 
[236, 49178, 5] 
[2364, 9, 1785] 
[2364, 91, 785] 
[2364, 917, 85] 
[2364, 9178, 5] 
[23649, 1, 785] 
[23649, 17, 85] 
[23649, 178, 5] 
[236491, 7, 85] 
[236491, 78, 5] 
[2364917, 8, 5] 

ように生成されます10160640(362880 * 28)のリストがあります。

FINAL CODE:

In [15]: a=map(lambda x:str(x), range(1,10)) 

In [16]: a 
Out[16]: ['1', '2', '3', '4', '5', '6', '7', '8', '9'] 

In [17]: result = [] 

In [18]: for seq in itertools.permutations(a,9): 
    ...:  for i in itertools.combinations(range(1,9),2): 
    ...:   result.append([int(''.join(seq[:i[0]])), int(''.join(seq[i[0]:i[1]])), int(''.join(seq[i[1]:]))]) 
    ...: 

In [19]: len(result) 
Out[19]: 10160640 
+0

@sebastian場合は、解決策を受け入れてください。 – tianwei

+0

これは非常に賢いです。ありがとう。 – sebastian

+0

しかし、残念ながらそれは動作しません。 'result'のリストがソートされます。だから、そこには常に2つの区切り文字を持つオリジナルの「a」があります。手順1で行った順列は何らかの形で失われてしまいます。 – sebastian

0

これは、受注案件を想定し、私はそれを行うだろうかです:成果@

は、例えば必要なオプションのリストです。数字0〜9の数字が必要な場合は、出力[0,1 ,. 。 。、9]。

@ lengthは、各出力番号の桁数です。あなたの質問に最大4桁を使用して、私はいくつかの上限があると仮定します。

以下の関数を使用して、トリプルの個々の部分ごとに順列を生成し、その結果を元に戻してさらに順列を生成します。

def gen_permutations(outcomes, length): 
     ans = set([()]) 
     for dummy_idx in range(length): 
      temp = set() 
      for seq in ans: 
       for item in outcomes: #each possible outcome 
        new_seq = list(seq) 
        if len(outcomes) == 1 or item in new_seq: 
         continue 
        new_seq.append(item) 
        temp.add(tuple(new_seq)) 
      ans = temp 

     return ans 
+0

各番号の上限はありません。ちょうど3つあり、すべての数字は1回しか使用できません。したがって '(1,2、3456789)'も有効なトリプルです。また、あなたの関数はそれを行うべきではありません。これは、与えられた長さの並べ替えのリストを提供し、数字を提供します。 – sebastian

関連する問題