2016-10-25 3 views
0

Ich benutze itertools.product, um mit einer Kombination von Gruppen zu kommen. Ich bin schlecht zu erklären, ohne Beispiele, so hier ist Code wie es ist.Itertools.product, um die Anzahl der Combos für jede Eingabe anzupassen?

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

Dies gibt mir alle Kombinationen von 1 aus jeder Gruppe. Aber wie würde ich gehen, um Kombinationen von 2 Nummern aus Gruppe 1, 2 Nummern aus Gruppe 2 und 1 Nummer aus Gruppe 3 zu bekommen?

So zum Beispiel möchte ich die Kombination (1,2,5,6,9) in der Liste sein. Ist es möglich, dies anzupassen? itertools.product scheint nicht so flexibel zu sein, wie ich es brauche, und ich war nicht erfolgreich genug, kartesische Produkte zu lernen, um zu verstehen, wie man die .product-Funktion optimiert.

EDIT: Ich machte die Gruppen klein, um es einfach zu halten, aber jede Gruppe wird Hunderte von einzigartigen Werten haben.

+0

Sie benötigen ein Produkt von '[1, 2]', '[5, 6]' und '[9]' oder die Kombinationen von '[1, 2, 5, 6, 9]' –

+2

If group1, group2 , und group3 haben alle 200 Elemente, Sie betrachten etwas wie 79202000000 verschiedene Möglichkeiten, die viel zu viele sind, um darüber zu iterieren, obwohl wir sie nicht materialisieren. Sind Sie sicher, dass Sie die Frage stellen, die Sie tatsächlich benötigen? – DSM

Antwort

2

Nehmen Sie das Kreuzprodukt der R-Kombinationen der einzelnen Gruppen:

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))) 

Ausgang:

(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) 

Sie combinations-permutations ändern können, wenn Fragen um, wenn aus jeder Gruppe die Auswahl (zB , wenn (3, 2, 5, 6, 9) sich von (2, 3, 5, 6, 9) unterscheidet).

Sie sollten beachten, dass dies choose(|g1|, c1) * choose(|g2|, c2) * ... * choose(|gN|, cN) Elemente aus N Gruppen erzeugt, wobei choose(n, k) die binomial coefficient ist. Dies ist unberechenbar groß, wenn Ihre Gruppengrößen zu Hunderten sind, wie Sie sagen - oder wenn die Anzahl der Gruppen ebenfalls groß ist.

Verwandte Themen