Skip to content

Ausbrechen aus verschachtelten Schleifen in Python

Python

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.