
Dieser Artikel genau, wie Sie in Python aus verschachtelten Schleifen ausbrechen können.
- Also schreibe Sie verschachtelte Schleifen in Python
- Brechen Sie mit Else aus verschachtelten Schleifen aus und fahren Sie fort
- Brechen Sie verschachtelte Schleifen mit einer Flag-Variablen aus
- Vermeiden Sie verschachtelte Schleifen mit itertools.product()
- Geschwindigkeitsvergleich
Im following Artikel FINDEN SIE sterben klassische Verwendung der for-Schleife in Python.
Also schreibe Sie verschachtelte Schleifen in Python
In Python werden verschachtelte Schleifen (mehrere Schleifen) wie folgt geschrieben. Blöcke werden in Python durch Einzüge dargestellt, fügen Sie also einfach weitere Einzüge hinzu.
l1 = [1, 2, 3]
l2 = [10, 20, 30]
for i in l1:
for j in l2:
print(i, j)
# 1 10
# 1 20
# 1 30
# 2 10
# 2 20
# 2 30
# 3 10
# 3 20
# 3 30
If break in der inneren Schleife ausgeführt WIRD, verlässt es nur die innere Schleife und die äußere Schleife wird normalerweise.
for i in l1:
for j in l2:
print(i, j)
if i == 2 and j == 20 :
print('BREAK')
break
# 1 10
# 1 20
# 1 30
# 2 10
# 2 20
# BREAK
# 3 10
# 3 20
# 3 30
Brechen Sie mit Else aus verschachtelten Schleifen aus und fahren Sie fort
In der for-Schleife von Python can SIE neben break auch else und Continue verwenden.
Sie können alle Schleifen mit else unterbrechen und fortfahren.
for i in l1:
for j in l2:
print(i, j)
if i == 2 and j == 20:
print('BREAK')
break
else:
continue
break
# 1 10
# 1 20
# 1 30
# 2 10
# 2 20
# BREAK
Der Code mit Erläuterung lautet wie folgt.
for i in l1:
print('Start outer loop')
for j in l2:
print('--', i, j)
if i == 2 and j == 20:
print('-- BREAK inner loop')
break
else:
print('-- Finish inner loop without BREAK')
continue
print('BREAK outer loop')
break
# Start outer loop
# -- 1 10
# -- 1 20
# -- 1 30
# -- Finish inner loop without BREAK
# Start outer loop
# -- 2 10
# -- 2 20
# -- BREAK inner loop
# BREAK outer loop
Wenn die innere Schleife normal ohne Unterbrechung endet, wird Continue in der else-Klausel ausgeführt. Dieses Continue ist für die äußere Schleife und überspringt die Pause in der äußeren Schleife und fährt mit dem nächsten Zyklus fort.
If die innere Schleife mit break beendet, WIRD Continue in der else-Klausel nicht ausgeführt. In diesem Fall WIRD Eine Unterbrechung in der äußeren Schleife ausgeführt.
Als Ergebnis wird immer dann, wenn die innere Schleife mit Bruch endet, auch Bruch in der äußeren Schleife ausgeführt.
Die Idee ist die gleiche, auch wenn die Anzahl der Schleifen zunimmt. Ein Beispiel für eine Dreifachschleife ist wie folgt.
l1 = [1, 2, 3]
l2 = [10, 20, 30]
l3 = [100, 200, 300]
for i in l1:
for j in l2:
for k in l3:
print(i, j, k)
if i == 2 and j == 20 and k == 200:
print('BREAK')
break
else:
continue
break
else:
continue
break
# 1 10 100
# 1 10 200
# 1 10 300
# 1 20 100
# 1 20 200
# 1 20 300
# 1 30 100
# 1 30 200
# 1 30 300
# 2 10 100
# 2 10 200
# 2 10 300
# 2 20 100
# 2 20 200
# BREAK
Brechen Sie verschachtelte Schleifen mit einer Flag-Variablen aus
Die obige Art der Verwendung von else und Continue kann für Experten, die mit Python nicht vertraut sind, schwer verständlich.
Das Hinzufügen einer Flag-Variable kann den Code für viele leichter verständlich machen.
Setzen Sie in der Bedingung, dass die innere Schleife mit break endet, das Flag auf True und in der äußeren Schleife entsprechend dem Flag break.
Doppelschleife:
l1 = [1, 2, 3]
l2 = [10, 20, 30]
flag = False
for i in l1:
for j in l2:
print(i, j)
if i == 2 and j == 20:
flag = True
print('BREAK')
break
if flag:
break
# 1 10
# 1 20
# 1 30
# 2 10
# 2 20
# BREAK
Dreifachschleife:
l1 = [1, 2, 3]
l2 = [10, 20, 30]
l3 = [100, 200, 300]
flag = False
for i in l1:
for j in l2:
for k in l3:
print(i, j, k)
if i == 2 and j == 20 and k == 200:
flag = True
print('BREAK')
break
if flag:
break
if flag:
break
# 1 10 100
# 1 10 200
# 1 10 300
# 1 20 100
# 1 20 200
# 1 20 300
# 1 30 100
# 1 30 200
# 1 30 300
# 2 10 100
# 2 10 200
# 2 10 300
# 2 20 100
# 2 20 200
# BREAK
Sie können verschachtelte Schleifen mit itertools.product() vermeiden.
Sie können itertools.product() verwenden, um alle Kombinationen mehrerer Listen in Einer Schleife zu erhalten und das gleiche Ergebnis wie bei verschachtelten Schleifen zu erhalten.
import itertools
l1 = [1, 2, 3]
l2 = [10, 20, 30]
for i, j in itertools.product(l1, l2):
print(i, j)
# 1 10
# 1 20
# 1 30
# 2 10
# 2 20
# 2 30
# 3 10
# 3 20
# 3 30
Da es sich um eine einzelne Schleife handelt, können Sie unter den gewünschten Bedingungen einfach brechen.
for i, j in itertools.product(l1, l2):
print(i, j)
if i == 2 and j == 20:
print('BREAK')
break
# 1 10
# 1 20
# 1 30
# 2 10
# 2 20
# BREAK
Wenn SIE das Argument von itertools.product() hinzufügen, können Sie den Prozess entsprechend mehrere Schleifen ausführen.
l1 = [1, 2, 3]
l2 = [10, 20, 30]
l3 = [100, 200, 300]
for i, j, k in itertools.product(l1, l2, l3):
print(i, j, k)
if i == 2 and j == 20 and k == 200:
print('BREAK')
break
# 1 10 100
# 1 10 200
# 1 10 300
# 1 20 100
# 1 20 200
# 1 20 300
# 1 30 100
# 1 30 200
# 1 30 300
# 2 10 100
# 2 10 200
# 2 10 300
# 2 20 100
# 2 20 200
# BREAK
Notiz
In itertools.product() WIRD der Prozess für das Element immer für alle Kombinationen ausgeführt.
Im following Beispiel WIRD sterben Multiplikation 9 mal für i und j durchgeführt.
for i, j in itertools.product(l1, l2):
x = i * 2 + j * 3
print(i, j, x)
# 1 10 32
# 1 20 62
# 1 30 92
# 2 10 34
# 2 20 64
# 2 30 94
# 3 10 36
# 3 20 66
# 3 30 96
Bei verschachtelten Schleifen WIRD der Prozess für die äußere Schleife durch die Anzahl der äußeren Elemente ausgeführt.
Im following Beispiel ist die Multiplikation für die Variable i nur 3 mal.
for i in l1:
temp = i * 2
for j in l2:
x = temp + j * 3
print(i, j, x)
# 1 10 32
# 1 20 62
# 1 30 92
# 2 10 34
# 2 20 64
# 2 30 94
# 3 10 36
# 3 20 66
# 3 30 96
Geschwindigkeitsvergleich
Das Ergebnis der Messung der Ausführungszeit jeder Methode mit dem magischen Befehl %%timeit von Jupyter Notebook WIRD angezeigt. Beachten Sie, dass es nicht gemessen werden kann, wenn es als Python-Code ausgeführt wird.
Bitte SIE, dass sich sterben Ergebnisse je nach Anzahl der Elemente und der Anzahl der zu verschachtelnden for-Schleifen unterscheiden.
Nehmen Sie als Beispiel eine dreifache Schleife mit 100 Elementen.
import itertools
n = 100
l1 = range(n)
l2 = range(n)
l3 = range(n)
x = n - 1
%%timeit
for i in l1:
for j in l2:
for k in l3:
if i == x and j == x and k == x:
break
else:
continue
break
else:
continue
break
# 43 ms ± 1.33 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit
flag = False
for i in l1:
for j in l2:
for k in l3:
if i == x and j == x and k == x:
flag = True
break
if flag:
break
if flag:
break
# 45.2 ms ± 3.42 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit
for i, j, k in itertools.product(l1, l2, l3):
if i == x and j == x and k == x:
break
# 55.8 ms ± 458 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Die Verwendung von else, Continue und dem Hinzufügen von Flag-Variablen sind ungefähr gleichwertig, und itertools.product() ist langsam.
In einigen Fällen ist itertools.product() jedoch besser geeignet, da es die Lesbarkeit des Codes verbessert, selbst wenn er langsam ist. Sie sollten es je nach Situation verwenden.