2016-10-25 7 views
0

私はitertools.productを使用してグループの組み合わせを思いついています。私は例がなくて説明が悪いので、ここにコードを示します。Itertools.productを使用して、各入力のコンボの量をカスタマイズできますか?

group1=[1,2,3];group2=[4,5,6];group3=[7,8,9] 
list(itertools.product(group1,group2,group3)) 

これにより、各グループから1つのすべての組み合わせが得られます。しかし、グループ1の2つの数字、グループ2の2つの数字、グループ3の1の数字の組み合わせを得るにはどうすればいいですか?

たとえば、私は組み合わせ(1,2,5,6,9)をリストに入れたいと思います。これをカスタマイズすることは可能ですか? itertools.productは、私が必要とするほど柔軟ではないようです。私はデカルト製品を調整する方法を理解するのに十分なデカルト製品を学ぶことに失敗しました。

編集:私はグループを小さくして単純にしましたが、各グループには何百ものユニークな値があります。

+0

あなたは '[1、2]'、 '' [5,6] '、' [9] 'または' [1,2,5,6,9] 'の組み合わせを必要とします。 –

+2

group1、group2 、およびgroup3にはすべて200個の要素がありますが、79202000000のようなものがあります。これは実現不可能であっても繰り返すことができません。実際に必要な質問をしていますか? – DSM

答えて

2

各グループのR-組み合わせのデカルト積を取る:

from itertools import product, chain, combinations, permutations 

groups = [[1,2,3],[4,5,6],[7,8,9]] 
counts = (2, 2, 1) 

selections = [combinations(g, c) for g, c in zip(groups, counts)] 

for n_tuple in product(*selections): 
    print(tuple(chain.from_iterable(n_tuple))) 

出力:

(1, 2, 4, 5, 7) 
(1, 2, 4, 5, 8) 
(1, 2, 4, 5, 9) 
(1, 2, 4, 6, 7) 
(1, 2, 4, 6, 8) 
(1, 2, 4, 6, 9) 
(1, 2, 5, 6, 7) 
(1, 2, 5, 6, 8) 
(1, 2, 5, 6, 9) 
(1, 3, 4, 5, 7) 
(1, 3, 4, 5, 8) 
(1, 3, 4, 5, 9) 
(1, 3, 4, 6, 7) 
(1, 3, 4, 6, 8) 
(1, 3, 4, 6, 9) 
(1, 3, 5, 6, 7) 
(1, 3, 5, 6, 8) 
(1, 3, 5, 6, 9) 
(2, 3, 4, 5, 7) 
(2, 3, 4, 5, 8) 
(2, 3, 4, 5, 9) 
(2, 3, 4, 6, 7) 
(2, 3, 4, 6, 8) 
(2, 3, 4, 6, 9) 
(2, 3, 5, 6, 7) 
(2, 3, 5, 6, 8) 
(2, 3, 5, 6, 9) 

を各グループから選択するときには、例えば(combinations場合permutationsに注文事項を変更することができます、(3, 2, 5, 6, 9)(2, 3, 5, 6, 9)と異なる場合)。

choose(n, k)binomial coefficientの場合は、N個のグループからchoose(|g1|, c1) * choose(|g2|, c2) * ... * choose(|gN|, cN)個の要素が生成されます。あなたのグループサイズがあなたの言うように数百になる場合、またはグループの数が多い場合には、これは膨大になります。

関連する問題