web-dev-qa-db-fra.com

Imbriqué pour les boucles utilisant la compréhension de liste

Si j'avais deux cordes, 'abc' et 'def', Je pourrais en obtenir toutes les combinaisons à l'aide de deux boucles for:

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

Cependant, j'aimerais pouvoir le faire en utilisant la compréhension de liste. J'ai essayé de nombreuses façons, mais je n'ai jamais réussi à l'obtenir. Est-ce que quelqu'un sait comment faire ça?

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]

si vous voulez des tuples.

Comme dans la question, for j... est la boucle extérieure, for k... est la boucle intérieure.

Essentiellement, vous pouvez avoir autant de clauses indépendantes "pour x dans y" que vous le souhaitez dans une compréhension de liste simplement en les collant les unes après les autres.

117
aaronasterling

Comme il s'agit essentiellement d'un produit cartésien, vous pouvez également utiliser itertools.product . Je pense que c'est plus clair, surtout quand vous avez plus d'itérations d'entrée.

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

Essayez également la récursivité:

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

Vous donne les 8 combinaisons:

abc
abf
aec
aef
dbc
dbf
dec
def
0
Stefan Gruenwald