Aninhados para loops usando compreensão de lista

88

Se eu tivesse duas strings 'abc'e 'def', poderia obter todas as combinações delas usando dois loops for:

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

No entanto, gostaria de poder fazer isso usando a compreensão de lista. Já tentei de várias maneiras, mas nunca consegui. Alguém sabe como fazer isso?

John Howard
fonte

Respostas:

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

ou

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

se você quiser tuplas.

Como na pergunta, for j...é o loop externo, for k...é o loop interno.

Essencialmente, você pode ter quantas cláusulas independentes 'for x in y' desejar em uma compreensão de lista, apenas colando uma após a outra.

Aaronasterling
fonte
1
E se você quiser fazer o loop aninhado para iterar em uma lista aninhada? Algo como: [imprimir ('a') para machado em machados para machados em machados] está imprimindo um monte em [Nenhum, Nenhum ...] até len (eixos)
Pablo Ruiz Ruiz
@Pablo Eu acho que você inverteu seus loops. L1 = [[[e1, e2, ...], ...], ...]->[ e for L2 in L1 for L3 in L2 for e in L3 ]
AnOccasionalCashew
A ordem das forinstruções é a mesma como se você as tivesse escrito como dois forloops em duas linhas separadas.
Boris
aaronasterling Posso usar declarações condicionais no seguinte?
Salik Malik
lst = [j+k if BLAHBLAHBLAH for j in s1 for k in s2]ou algo assim
Salik Malik
35

Como este é um produto essencialmente cartesiano, você também pode usar itertools.product . Acho que é mais claro, especialmente quando você tem mais iteráveis ​​de entrada.

itertools.product('abc', 'def', 'ghi')
milhas82
fonte
0

Tente recursão também:

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

Dá a você as 8 combinações:

abc
abf
aec
aef
dbc
dbf
dec
def
Stefan Gruenwald
fonte
Respondendo à pergunta de OP, acho que a saída deve fornecer pares de letras e deve haver 9 combinações.
Mattia
O que aconteceu a: abd, abe, acd, ace, acf, adb, adc, ade, adf, aeb, aed, afb, afc, afd, afe e todos os que começam com c, e ou f? Mesmo se a ordem não for importante, omitidos são: bda, ade, etc.
Harry Binswanger
A maneira como isso funciona é que a posição mais à esquerda só pode ser "a" ou "d", a posição do meio só pode ser "b" ou "e" e a posição direita só pode ser "c" ou "f" .
Stefan Gruenwald