Bucles for anidados mediante la comprensión de listas


85

Si tuviera dos cadenas 'abc'y 'def', podría obtener todas las combinaciones de ellas usando dos bucles for:

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

Sin embargo, me gustaría poder hacer esto usando la comprensión de listas. Lo he intentado de muchas maneras, pero nunca lo he conseguido. ¿Alguien sabe como hacer esto?

Respuestas:


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

o

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

si quieres tuplas.

Como en la pregunta, for j...es el bucle externo, for k...es el bucle interno.

Esencialmente, puede tener tantas cláusulas independientes 'para x en y' como desee en una lista de comprensión con solo pegar una tras otra.


1
¿Qué sucede si desea hacer el ciclo anidado para iterar sobre una lista anidada? Algo como: [print ('a') for axe in axs for axs in axes] está imprimiendo un montón en [None, None ...] hasta len (axes)
Pablo Ruiz Ruiz

@Pablo Creo que habías invertido tus bucles. L1 = [[[e1, e2, ...], ...], ...]->[ e for L2 in L1 for L3 in L2 for e in L3 ]
AnOccasionalCashew

El orden de las fordeclaraciones es el mismo que si lo hubiera escrito como dos forbucles en dos líneas separadas.
Boris

aaronasterling ¿Puedo usar declaraciones condicionales en lo siguiente?
Salik Malik

lst = [j+k if BLAHBLAHBLAH for j in s1 for k in s2]o algo así
Salik Malik

34

Dado que este es esencialmente un producto cartesiano, también puede usar itertools.product . Creo que es más claro, especialmente cuando tienes más iterables de entrada.

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

0

Prueba también la recursividad:

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

Te da las 8 combinaciones:

abc
abf
aec
aef
dbc
dbf
dec
def

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

¿Qué pasó con: abd, abe, acd, ace, 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.
Harry Binswanger

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 derecha solo puede ser "c" o "f" .
Stefan Gruenwald
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.