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.