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?

Était-ce utile?

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/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top