2017-06-14 7 views
0

Wie kann ich Python verwenden, um eine vollständige Kombination von Faktoren zu generieren? Gibt es eine ausgefallene itertools Funktion, die eine volle Fakultät erzeugt?Python: Wie generiere ich Full Factorial Combinations?

Ich zeichne ein Leerzeichen und kann mir keine andere Möglichkeit vorstellen, dies zu beschreiben als "volles factorial of combinations", so dass meine Suchanstrengungen ohne Relevanz sind. Was ist die richtige Terminologie hier? Die Suche ist mit Kombinationen bestimmter Längen entstanden, aber das ist nicht das, wonach ich suche. Die Länge ist durch die Anzahl der Faktoren festgelegt.

Bonus: Wie kann man bestimmte Kombinationen ausschließen? wie für eine beliebige Anzahl von Faktoren mit einer beliebigen Anzahl von Ebenen zu tun, mit der Bedingung, dass die "Ebenen" nicht unbedingt Strings sind, sondern ein Python-Objekt?

Sagen wir, ich habe 5 Faktoren mit jeweils zwei oder mehr Ebenen. In diesem Fall habe ich drei zweistufige Faktoren und zwei dreistufige Faktoren. Der volle Faktor der Kombinationen hätte (2^3) * (3^2) = 8 * 9 = 72 Kombinationen. Beachten Sie, dass sich "L1" in X1 von "L1" in X2 unterscheidet.

Input:

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 

Output:

[("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")] 

Antwort

2

Dies das kartesische Produkt von itertools.product wie implementiert genannt wird.

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

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

0

Hier arbeitet Code:

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 

Sie oben Code leicht ändern können, um die erforderliche Aufgabe zu erfüllen.