2010-09-03 7 views
51

Si j'avais deux cordes, 'abc' et 'def', je pouvais obtenir toutes les combinaisons de les utiliser deux pour les boucles:emboîtés Pour les boucles qui utilisent Liste Comprehension

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

Cependant, je voudrais être en mesure de le faire en utilisant liste de compréhension. 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?

Répondre

86
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 tuples. Comme dans la question for j... est la boucle externe, for k... est la boucle interne. Essentiellement, vous pouvez avoir autant de clauses indépendantes 'for x in y' que vous le souhaitez dans une liste de compréhension simplement en les collant les unes après les autres.

+0

+1 depuis l'OP a demandé de LC. –

27

Puisqu'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'entrées.

itertools.product('abc', 'def', 'ghi') 
+0

+1 parce que le produit est une meilleure réponse que LC pour cela –

+0

itertools frappe à nouveau! Belle solution –

0

Essayez aussi récursion:

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

Accourant à la question OP, je pense que la sortie devrait donner des couples de lettres, et il devrait y avoir 9 combinaisons. – Mattia

+0

Qu'est-il arrivé à: abd, abe, acd, as, acf, adb, adc, ade, adf, aeb, aed, afb, afc, afd, afe, et tous ceux commençant par c, e, ou f? Même si l'ordre n'est pas important, omis sont: bda, ade, etc. –

+0

La façon dont cela fonctionne est que la position la plus à gauche ne peut être que "a" ou "d", la position du milieu ne peut être que "b" ou " e ", et la bonne position ne peut être que" c "ou" f ". –

Questions connexes