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?

John Howard
fuente

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.

aaronasterling
fuente
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')
millas82
fuente
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
Stefan Gruenwald
fuente
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