ti-enxame.com

Aninhado para loops usando compreensão de lista

Se eu tivesse duas cordas, 'abc' e 'def', Eu poderia obter todas as combinações deles usando dois para loops:

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

No entanto, eu gostaria de poder fazer isso usando a compreensão da lista. Eu tentei de várias maneiras, mas nunca consegui obtê-lo. Alguém sabe como fazer isso?

73
John Howard
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 colocando uma após a outra.

117
aaronasterling

Como este é essencialmente um produto cartesiano, você também pode usar itertools.product . Eu acho que é mais claro, especialmente quando você tem mais iterables de entrada.

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

Experimente também a recursão:

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

Oferece as 8 combinações:

abc
abf
aec
aef
dbc
dbf
dec
def
0
Stefan Gruenwald