Verschachtelt für Schleifen mit Listenverständnis

85

Wenn ich zwei Zeichenfolgen hätte 'abc'und 'def', könnte ich alle Kombinationen davon mit zwei for-Schleifen erhalten:

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

Ich möchte dies jedoch mithilfe des Listenverständnisses tun können. Ich habe viele Möglichkeiten ausprobiert, aber es nie geschafft, es zu bekommen. Weiß jemand, wie man das macht?

John Howard
quelle

Antworten:

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

oder

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

wenn du Tupel willst.

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 in einem Listenverständnis möchten, indem Sie einfach nacheinander bleiben.

aaronasterling
quelle
1
Was ist, wenn Sie die verschachtelte Schleife ausführen möchten, um eine verschachtelte Liste zu durchlaufen? Etwas wie: [Drucken ('a') für Axt in Axt für Axt in Achsen] druckt einen Haufen auf [Keine, Keine ...] bis zu Länge (Achsen)
Pablo Ruiz Ruiz
@Pablo Ich denke du hattest deine Loops umgekehrt. L1 = [[[e1, e2, ...], ...], ...]->[ e for L2 in L1 for L3 in L2 for e in L3 ]
AnOccasionalCashew
Die Reihenfolge der forAnweisungen ist dieselbe, als hätten Sie sie als zwei forSchleifen in zwei separaten Zeilen geschrieben.
Boris
aaronasterling Kann ich im Folgenden bedingte Anweisungen verwenden?
Salik Malik
lst = [j+k if BLAHBLAHBLAH for j in s1 for k in s2]oder so
Salik Malik
34

Da es sich im Wesentlichen um ein kartesisches Produkt handelt, können Sie auch itertools.product verwenden . Ich denke, es ist klarer, besonders wenn Sie mehr iterable Eingaben haben.

itertools.product('abc', 'def', 'ghi')
Meilen82
quelle
0

Versuchen Sie auch die Rekursion:

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
Stefan Gruenwald
quelle
Gemäß der Frage von OP sollte die Ausgabe Buchstabenpaare enthalten, und es sollten 9 Kombinationen vorhanden sein.
Mattia
Was ist passiert mit: abd, abe, acd, ace, acf, adb, adc, ade, adf, aeb, aed, afb, afc, afd, afe und all jenen, die mit c, e oder f beginnen? Auch wenn die Reihenfolge nicht wichtig ist, werden weggelassen: bda, ade usw.
Harry Binswanger
Dies funktioniert so, dass die Position ganz links nur "a" oder "d" sein kann, die mittlere Position nur "b" oder "e" sein kann und die rechte Position nur "c" oder "f" sein kann. .
Stefan Gruenwald