59 votes

comment arrêter une boucle for

Je suis en train d'écrire un code pour déterminer si chaque élément de ma liste nxn est le même, c'est à dire [[0,0],[0,0]] retourne vrai mais [[0,1],[0,0]] renverra un message faux. Je pensais écrire un code qui s'arrête immédiatement lorsqu'il trouve un élément qui n'est pas le même que le premier élément, c'est-à-dire

n=L[0][0]
m=len(A)
for i in range(m):
 for j in range(m):
   if
    L[i][j]==n: -continue the loop-
   else: -stop the loop-

Je voudrais arrêter cette boucle si L[i][j]!==n et renvoie false. Sinon, il renvoie true. Comment dois-je m'y prendre pour mettre cela en œuvre ?

95voto

Alexander Gessler Points 26717

Utilice break y continue pour ce faire. La rupture des boucles imbriquées peut être effectuée en Python en utilisant ce qui suit :

for a in range(...):
   for b in range(..):
      if some condition:
         # break the inner loop
         break
   else:
      # will be called if the previous loop did not end with a `break` 
      continue
   # but here we end up right after breaking the inner loop, so we can
   # simply break the outer loop as well
   break

Une autre solution consiste à tout regrouper dans une fonction et à utiliser la fonction return pour sortir de la boucle.

3 votes

Wow, j'aimerais que C# ait cela for...else construire !

2 votes

Oh, je souhaite la même chose pour C++, Java, :-)

0 votes

J'essaie de faire en sorte que la fonction renvoie une valeur avant la pause, mais j'obtiens toujours un avertissement indiquant que la pause ne sera jamais atteinte.

64voto

e-satis Points 146299

Il y a plusieurs façons de procéder :

La méthode simple : une variable sentinelle

n = L[0][0]
m = len(A)
found = False
for i in range(m):
   if found:
      break
   for j in range(m):
     if L[i][j] != n: 
       found = True
       break

Avantages : facile à comprendre Inconvénients : déclaration conditionnelle supplémentaire pour chaque boucle

La méthode hacky : lever une exception

n = L[0][0]
m = len(A)

try:
  for x in range(3):
    for z in range(3):
     if L[i][j] != n: 
       raise StopIteration
except StopIteration:
   pass

Avantages : très simple Inconvénients : vous utilisez l'exception en dehors de sa sémantique

La méthode propre : créer une fonction

def is_different_value(l, elem, size):
  for x in range(size):
    for z in range(size):
     if l[i][j] != elem: 
       return True
  return False

if is_different_value(L, L[0][0], len(A)):
  print "Doh"

avantages : beaucoup plus propre et toujours efficace inconvénients : on a l'impression d'être en C

La méthode pythonique : utiliser l'itération comme il se doit

def is_different_value(iterable):
  first = iterable[0][0]
  for l in iterable:
    for elem in l:
       if elem != first: 
          return True
  return False

if is_different_value(L):
  print "Doh"

avantages : toujours propre et efficace inconvénients : il faut réinventer la roue

La méthode du gourou : utiliser any() :

def is_different_value(iterable):
  first = iterable[0][0]
  return any(cell != first for col in iterable for cell in col)

if is_different_value(L):
  print "Doh"

avantages : vous vous sentirez plus fort grâce à vos pouvoirs obscurs inconvénients : les personnes qui liront votre code pourraient commencer à vous détester

4voto

Artsiom Rudzenka Points 9771

Essayez d'utiliser simplement pause déclaration.

Vous pouvez également utiliser le code suivant comme exemple :

a = [[0,1,0], [1,0,0], [1,1,1]]
b = [[0,0,0], [0,0,0], [0,0,0]]

def check_matr(matr, expVal):    
    for row in matr:
        if len(set(row)) > 1 or set(row).pop() != expVal:
            print 'Wrong'
            break# or return
        else:
            print 'ok'
    else:
        print 'empty'
check_matr(a, 0)
check_matr(b, 0)

0voto

scoopseven Points 524

0voto

mouad Points 21520

Il existe d'autres moyens de faire la même chose :

el = L[0][0]
m=len(L)

print L == [[el]*m]*m

Ou bien :

first_el = L[0][0]
print all(el == first_el for inner_list in L for el in inner_list)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X