2010-09-03 8 views
51

Si tuviera dos cadenas, 'abc' y 'def', podría conseguir todas las combinaciones de ellos utilizando dos bucles for:bucles for anidados utilizando la lista de Comprensión

for j in s1: 
    for k in s2: 
    print(j, k) 

Sin embargo, me gustaría ser capaz de hacer esto utilizando lista de comprensión. Lo intenté de muchas maneras, pero nunca lo logré. ¿Alguien sabe como hacer esto?

Respuesta

86
lst = [j + k for j in s1 for k in s2] 

o

lst = [(j, k) for j in s1 for k in s2] 

si quieren tuplas.

Al igual que en la pregunta, for j... es el bucle exterior, for k... es el bucle interno.

Básicamente, puede tener tantas cláusulas 'para x in y' independientes como desee en una lista de comprensión simplemente pegándolas una detrás de la otra.

+0

+1 desde el PO pidió LC. –

27

Como se trata esencialmente de un producto cartesiano, también puede usar itertools.product. Creo que es más claro, especialmente cuando tienes más elementos de entrada.

itertools.product('abc', 'def', 'ghi') 
+0

+1 porque el producto es una respuesta más agradable que los LC para este –

+0

itertools ataca de nuevo! Buena solución –

0

Try recursividad también:

s="" 
s1="abc" 
s2="def" 
def combinations(s,l): 
    if l==0: 
     print s 
    else: 
     combinations(s+s1[len(s1)-l],l-1) 
     combinations(s+s2[len(s2)-l],l-1) 

combinations(s,len(s1)) 

le da las 8 combinaciones:

abc 
abf 
aec 
aef 
dbc 
dbf 
dec 
def 
+0

De acuerdo con la pregunta de OP, creo que la salida debería dar parejas de letras, y debería haber 9 combinaciones. – Mattia

+0

¿Qué le sucedió a: abd, abe, acd, as, acf, adb, adc, ade, adf, aeb, aed, afb, afc, afd, afe y todos los que comienzan con c, e, o f? Incluso si el orden no es importante, se omiten: bda, ade, etc. –

+0

La forma en que esto funciona es que la posición más a la izquierda solo puede ser "a" o "d", la posición intermedia solo puede ser "b" o " e ", y la posición correcta solo puede ser" c "o" f ". –

Cuestiones relacionadas