2011-06-05 16 views
6

Estoy tratando de hacer algunas cosas combinatorias con datos en Python. miré la cuestión How to generate all permutations of a list in Python, pero piensan que no se ajusta a mis necesidades .. tengo los datos de este tipo ...:combinatoriales Python sin repetición - Pyncomb?

group1-Steve 
    group1-Mark 
    group1-Tom 
    group2-Brett 
    group2-Mick 
    group2-Foo 
    group3-Dan 
    group3-Phil 

... y necesito para hacer todas las combinaciones posibles de los tres elementos con solo uno de cada grupo, sin repeticiones, guardando en una lista cada combinación.

Sé que en este caso hay 18 posibles combinaciones diferentes (3 * 3 * 2 = 18), pero no sé cómo podría escribir este código. He leído sobre el paquete Pyncomb, pero no conozco la función para aplicar en este caso; tal vez hay una función que hace el trabajo.

Esperanza alguien me podría ayudar ...

Gracias de antemano;

Peixe

Respuesta

9

La forma más sencilla es utilizar itertools.product():

group1 = ["Steve", "Mark", "Tom"] 
group2 = ["Brett", "Mick", "Foo"] 
group3 = ["Dan", "Phil"] 
for x in itertools.product(group1, group2, group3): 
    print x 

impresiones

('Steve', 'Brett', 'Dan') 
('Steve', 'Brett', 'Phil') 
('Steve', 'Mick', 'Dan') 
('Steve', 'Mick', 'Phil') 
('Steve', 'Foo', 'Dan') 
('Steve', 'Foo', 'Phil') 
('Mark', 'Brett', 'Dan') 
('Mark', 'Brett', 'Phil') 
('Mark', 'Mick', 'Dan') 
('Mark', 'Mick', 'Phil') 
('Mark', 'Foo', 'Dan') 
('Mark', 'Foo', 'Phil') 
('Tom', 'Brett', 'Dan') 
('Tom', 'Brett', 'Phil') 
('Tom', 'Mick', 'Dan') 
('Tom', 'Mick', 'Phil') 
('Tom', 'Foo', 'Dan') 
('Tom', 'Foo', 'Phil') 
+0

¡Oh sí! He estado probando con décimas líneas de código, pero esta solución es realmente increíble y simple. : DD ¡Muchas gracias, Sven! – peixe

4

Otra alternativa que evita la importación es utilizar una lista por comprensión:

[(a, b, c) for a in group1 for b in group2 for c in group3] 

Esto da el mismo resultado que Sven, pero es bueno si también quieres filtrar.

+0

Voy a probar esta solución, también. Como tengo que administrar grandes cantidades de datos organizados de esta manera, finalmente selecciono el más eficiente. ; D Gracias, PAG! – peixe

+1

Esto puede ser más eficiente, particularmente si cambia los corchetes a paréntesis: para x en ((a, b, c) para ....): .... – PAG

+0

La diferencia más importante entre los dos enfoques es that 'itertools.product()' también se puede usar si no conoce la cantidad de grupos por adelantado, mientras que este enfoque codifica el número de grupos. –

Cuestiones relacionadas