2010-09-03 7 views
51

Wenn ich zwei Saiten hatte, 'abc' und 'def', konnte ich alle Kombinationen von ihnen bekommen zwei for-Schleifen mit:verschachtelten for-Schleifen verwenden Listenkomprehension

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

Allerdings würde Ich mag Lage sein, dies zu tun, mit Listenverständnis. Ich habe viele Möglichkeiten ausprobiert, habe es aber nie geschafft. Weiß jemand, wie man das macht?

Antwort

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

oder

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

wenn Sie Tupeln wollen.

Wie in der Frage, for j... ist die äußere Schleife, for k... ist die innere Schleife.

Im Wesentlichen können Sie so viele unabhängige 'für x in y'-Klauseln haben, wie Sie wollen, indem Sie nur nacheinander auf das Listenverständnis klicken.

+0

+1, da die OP fragte nach LC ist. –

27

Da dies im Wesentlichen ein kartesisches Produkt ist, können Sie auch itertools.product verwenden. Ich denke, es ist klarer, besonders wenn Sie mehr Eingabe-Iterables haben.

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

+1, weil Produkt ist eine bessere Antwort als LC für diese –

+0

itertools schlägt wieder! Nette Lösung –

0

Try Rekursion zu:

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

gibt Ihnen die 8 Kombinationen:

abc 
abf 
aec 
aef 
dbc 
dbf 
dec 
def 
+0

Gemäß der OP-Frage, ich denke, die Ausgabe sollte Paare von Briefen geben, und es sollte 9 Kombinationen geben. – Mattia

+0

Was passierte mit: abd, abe, acd, ace, acf, adb, adc, ade, adf, aeb, aed, afb, afc, afd, afe und allen, die mit c, e oder f beginnen? Auch wenn die Reihenfolge nicht wichtig ist, werden weggelassen: bda, ade, etc. –

+0

Die Funktionsweise ist, dass die linke Position nur "a" oder "d" sein kann, die mittlere Position kann nur "b" oder "" sein e ", und die richtige Position kann nur" c "oder" f "sein. –