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?

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.


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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.