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?
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.
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')
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