2010-05-17 24 views
31

En Python tengo una lista de n listas, cada una con un número variable de elementos. ¿Cómo puedo crear una lista única que contiene todas las posibles permutaciones:Todas las permutaciones posibles de un conjunto de listas en Python

Por ejemplo

[ [ a, b, c], [d], [e, f] ] 

Quiero

[ [a, d, e] , [a, d, f], [b, d, e], [b, d, f], [c, d, e], [c, d, f] ] 

Nota No sé n de antemano. Pensé itertools.product sería el enfoque correcto, pero me obliga a conocer el número de argumentos con antelación

+0

No lo entiendo - ¿por qué no cuentas las listas para encontrar n? –

+1

Puedo hacer eso, ¿cómo me ayuda? – rauyran

Respuesta

56

No es necesario n saber de antemano a utilizar itertools.product

>>> import itertools 
>>> s=[ [ 'a', 'b', 'c'], ['d'], ['e', 'f'] ] 
>>> list(itertools.product(*s)) 
[('a', 'd', 'e'), ('a', 'd', 'f'), ('b', 'd', 'e'), ('b', 'd', 'f'), ('c', 'd', 'e'), ('c', 'd', 'f')] 
+0

Sí - Las listas de argumentos en Python pueden ser bastante útiles. – Amber

+0

(Para obtener más información sobre listas de argumentos: http://docs.python.org/tutorial/controlflow.html#arbitrary-argument-lists) – Amber

+0

Genial. Me faltaba cómo usar la lista de argumentos correctamente. – rauyran

2

Puede hacerlo con una lista de varios niveles de comprensión:

>>> L1=['a','b','c'] 
>>> L2=['d'] 
>>> L3=['e','f'] 
>>> [[i,j,k] for i in L1 for j in L2 for k in L3] 
[['a', 'd', 'e'], ['a', 'd', 'f'], ['b', 'd', 'e'], ['b', 'd', 'f'], ['c', 'd', 'e'], ['c', 'd', 'f']] 
+2

Esto requiere que sepas de antemano el número de 'n' (' n = 3' en tu respuesta) :) – badp

+0

Gracias, pero no sé el número de listas por adelantado. Tengo el equivalente de [L1, L2, L3, ...] – rauyran

+0

Ah bien, no estaba claro a qué se refería con "saber la cantidad de argumentos por adelantado" - Pensé que quizás se refería a la longitud de las listas –

4

itertools.product funciona para mí.

>>> l=[ [ 1, 2, 3], [4], [5, 6] ] 
>>> list(itertools.product(*l)) 
[(1, 4, 5), (1, 4, 6), (2, 4, 5), (2, 4, 6), (3, 4, 5), (3, 4, 6)] 
>>> l=[ [ 1, 2, 3], [4], [5, 6],[7,8] ] 
>>> list(itertools.product(*l)) 
[(1, 4, 5, 7), (1, 4, 5, 8), (1, 4, 6, 7), (1, 4, 6, 8), (2, 4, 5, 7), (2, 4, 5, 8), (2, 4, 6, 7), (2, 4, 6, 8), (3, 4, 5, 7), (3, 4, 5, 8), (3, 4, 6, 
7), (3, 4, 6, 8)] 
>>> 
Cuestiones relacionadas