2017-06-14 1 views
0

どのように組み合わせの完全な階乗を生成するためにPythonを使用できますか?完全な階乗を生成する派手なitertools関数はありますか?Python:完全な因数の組み合わせを生成するには?

私は空白を描いているので、「組み合わせの完全な階乗」以外の別の方法を考えることはできません。ここで正しい用語は何ですか?検索は特定の長さの組み合わせで表示されていますが、それは私が後にしたものではありません。長さは要因の数で固定されます。

ボーナス:特定の組み合わせを除外する方法は? "レベル"は必ずしも文字列ではなく、任意のpythonオブジェクトであるという条件で任意の数のレベルで任意の数の要素を処理する方法は?

私は5つの要因、それぞれが2つ以上のレベルを持っているとしましょう。この場合、私は3つの2レベルの要因と2つの3レベルの要因を持っています。組み合わせの完全な階乗は(2^3)*(3^2)= 8 * 9 = 72の組み合わせを持つでしょう。 "L1"はで、"L1"X2とは異なります。

入力:

X1 = ["L1", "L2"] 
X2 = ["L1", "L2", "L3"] 
X3 = ["L1", "L2"] 
X4 = ["L1", "L2"] 
X5 = ["L1", "L2", "L3"] 

full_factorial_combinations = itertools.fancyfunction(X1, X2, X3, X4, X5) 
full_factorial_combinations #optionally produces a generator instead of list of tuples shown here 

出力:

[("L1", "L1", "L1", "L1", "L1"), 
("L1", "L1", "L1", "L1", "L2"), 
("L1", "L1", "L1", "L1", "L3"), 
("L1", "L1", "L1", "L2", "L1"), 
("L1", "L1", "L1", "L2", "L2"), 
("L1", "L1", "L1", "L2", "L3"), 
("L1", "L1", "L2", "L1", "L1"), 
("L1", "L1", "L2", "L1", "L2"), 
("L1", "L1", "L2", "L1", "L3"), 
("L1", "L1", "L2", "L2", "L1"), 
("L1", "L1", "L2", "L2", "L2"), 
("L1", "L1", "L2", "L2", "L3"), 
("L1", "L2", "L1", "L1", "L1"), 
("L1", "L2", "L1", "L1", "L2"), 
("L1", "L2", "L1", "L1", "L3"), 
("L1", "L2", "L1", "L2", "L1"), 
("L1", "L2", "L1", "L2", "L2"), 
("L1", "L2", "L1", "L2", "L3"), 
("L1", "L2", "L2", "L1", "L1"), 
("L1", "L2", "L2", "L1", "L2"), 
("L1", "L2", "L2", "L1", "L3"), 
("L1", "L2", "L2", "L2", "L1"), 
("L1", "L2", "L2", "L2", "L2"), 
("L1", "L2", "L2", "L2", "L3"), 
("L1", "L3", "L1", "L1", "L1"), 
("L1", "L3", "L1", "L1", "L2"), 
("L1", "L3", "L1", "L1", "L3"), 
("L1", "L3", "L1", "L2", "L1"), 
("L1", "L3", "L1", "L2", "L2"), 
("L1", "L3", "L1", "L2", "L3"), 
("L1", "L3", "L2", "L1", "L1"), 
("L1", "L3", "L2", "L1", "L2"), 
("L1", "L3", "L2", "L1", "L3"), 
("L1", "L3", "L2", "L2", "L1"), 
("L1", "L3", "L2", "L2", "L2"), 
("L1", "L3", "L2", "L2", "L3"), 
("L2", "L1", "L1", "L1", "L1"), 
("L2", "L1", "L1", "L1", "L2"), 
("L2", "L1", "L1", "L1", "L3"), 
("L2", "L1", "L1", "L2", "L1"), 
("L2", "L1", "L1", "L2", "L2"), 
("L2", "L1", "L1", "L2", "L3"), 
("L2", "L1", "L2", "L1", "L1"), 
("L2", "L1", "L2", "L1", "L2"), 
("L2", "L1", "L2", "L1", "L3"), 
("L2", "L1", "L2", "L2", "L1"), 
("L2", "L1", "L2", "L2", "L2"), 
("L2", "L1", "L2", "L2", "L3"), 
("L2", "L2", "L1", "L1", "L1"), 
("L2", "L2", "L1", "L1", "L2"), 
("L2", "L2", "L1", "L1", "L3"), 
("L2", "L2", "L1", "L2", "L1"), 
("L2", "L2", "L1", "L2", "L2"), 
("L2", "L2", "L1", "L2", "L3"), 
("L2", "L2", "L2", "L1", "L1"), 
("L2", "L2", "L2", "L1", "L2"), 
("L2", "L2", "L2", "L1", "L3"), 
("L2", "L2", "L2", "L2", "L1"), 
("L2", "L2", "L2", "L2", "L2"), 
("L2", "L2", "L2", "L2", "L3"), 
("L2", "L3", "L1", "L1", "L1"), 
("L2", "L3", "L1", "L1", "L2"), 
("L2", "L3", "L1", "L1", "L3"), 
("L2", "L3", "L1", "L2", "L1"), 
("L2", "L3", "L1", "L2", "L2"), 
("L2", "L3", "L1", "L2", "L3"), 
("L2", "L3", "L2", "L1", "L1"), 
("L2", "L3", "L2", "L1", "L2"), 
("L2", "L3", "L2", "L1", "L3"), 
("L2", "L3", "L2", "L2", "L1"), 
("L2", "L3", "L2", "L2", "L2"), 
("L2", "L3", "L2", "L2", "L3")] 

答えて

2

itertools.productによって実装される。これはデカルト積と呼ばれています。

itertools.product(X1, X2, X3, X4, X5) 
+0

docs link:https://docs.python.org/3.6/library/itertools.html#itertools.product – Will

0

はここでのコードを働いている:

import itertools 
X1 = ["L1", "L2"] 
X2 = ["L1", "L2", "L3"] 
X3 = ["L1", "L2"] 
X4 = ["L1", "L2"] 
X5 = ["L1", "L2", "L3"] 
number=1 
for combination in itertools.product(X1,X2,X3,X4,X5): 
    print number, combination 
    number+=1 

あなたは簡単に必要なタスクを実行するために、コードの上に変更することができます。

関連する問題