Briser la boucle imbriquée (double) en Python [double]
-
25-09-2019 - |
Question
Cette question a déjà une réponse ici:
- Comment sortir de boucles multiples? 29 réponses
J'utilise la méthode suivante pour rompre la double boucle dans le python.
for word1 in buf1:
find = False
for word2 in buf2:
...
if res == res1:
print "BINGO " + word1 + ":" + word2
find = True
if find:
break
Y at-il une meilleure façon de briser la double boucle?
La solution
Probablement pas ce que vous espériez, mais généralement vous voulez avoir un break
après la mise find
à True
for word1 in buf1:
find = False
for word2 in buf2:
...
if res == res1:
print "BINGO " + word1 + ":" + word2
find = True
break # <-- break here too
if find:
break
Une autre façon consiste à utiliser une expression de générateur pour écraser le for
en une seule boucle
for word1, word2 in ((w1, w2) for w1 in buf1 for w2 in buf2):
...
if res == res1:
print "BINGO " + word1 + ":" + word2
break
Vous pouvez également envisager d'utiliser itertools.product
from itertools import product
for word1, word2 in product(buf1, buf2):
...
if res == res1:
print "BINGO " + word1 + ":" + word2
break
Autres conseils
La méthode recommandée en Python pour casser les boucles imbriquées est ... Exception
class Found(Exception): pass
try:
for i in range(100):
for j in range(1000):
for k in range(10000):
if i + j + k == 777:
raise Found
except Found:
print i, j, k
La plupart du temps, vous pouvez utiliser plusieurs méthodes pour faire une seule boucle qui fait la même chose comme une double boucle.
Dans votre exemple, vous pouvez utiliser itertools.product pour remplacer extrait de code avec
import itertools
for word1, word2 in itertools.product(buf1, buf2):
if word1 == word2:
print "BINGO " + word1 + ":" + word2
break
Les autres fonctions de itertools sont bonnes pour d'autres motifs aussi.
Refactor en utilisant des fonctions afin que vous puissiez revenir quand vous trouvez votre « bingo ».
La proposition visant à permettre la rupture explicite de boucles imbriquées a été rejetée: http://www.python.org/dev/peps/pep-3136/