hoe stop je een for-lus

Ik ben een code aan het schrijven om te bepalen of elk element in mijn nxn-lijst hetzelfde is. d.w.z. [[0,0],[0,0]]retourneert true maar [[0,1],[0,0]]retourneert false. Ik zat te denken aan het schrijven van een code die onmiddellijk stopt wanneer hij een element vindt dat niet hetzelfde is als het eerste element. dat wil zeggen:

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-

Ik wil deze lus stoppen als L[i][j]!==nen false retourneren. geef anders true terug. Hoe zou ik dit gaan implementeren?


Antwoord 1, autoriteit 100%

Gebruik breaken continueom dit te doen. Het doorbreken van geneste lussen kan in Python worden gedaan door het volgende te gebruiken:

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

Een andere manier is om alles in een functie te stoppen en returnte gebruiken om uit de lus te ontsnappen.


Antwoord 2, autoriteit 66%

Er zijn verschillende manieren om dit te doen:

De eenvoudige manier: een schildwachtvariabele

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

Pluspunten: gemakkelijk te begrijpen
Nadelen: extra voorwaardelijke instructie voor elke lus

The hacky Way: een uitzondering maken

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

Pluspunten: heel eenvoudig
Nadelen: je gebruikt Exception buiten hun semantiek

De schone manier: maak een functie

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"

pluspunten: veel schoner en toch efficiënt
nadelen: voelt toch als C

De pythonische manier: gebruik iteratie zoals het hoort

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"

pluspunten: nog steeds schoon en efficiënt
nadelen: u vindt het wiel opnieuw uit

De goeroe-manier: gebruik any():

def is_different_value(iterable):
  first = iterable[0][0]
  return  any(any((cell != first for cell in col)) for elem in iterable)):
if is_different_value(L):
  print "Doh"

pluspunten: je voelt je gesterkt door duistere krachten
nadelen: mensen die je code lezen, beginnen je misschien niet leuk te vinden


Antwoord 3, autoriteit 2%

Probeer gewoon breakstatement.

U kunt ook de volgende code als voorbeeld gebruiken:

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)

Antwoord 4

Gebruik de break-statement: http://docs.python.org/reference/simple_stmts .html#break


Antwoord 5

Andere manieren om hetzelfde te doen zijn:

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

Of:

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

Antwoord 6

Om dit te bereiken zou je zoiets doen als:

n=L[0][0]
m=len(A)
for i in range(m):
    for j in range(m):
        if L[i][j]==n:
            //do some processing
        else:
            break;

Antwoord 7

Om uit een lus te springen, moet je het break-statement gebruiken.

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

Hier heb je de officiële Python-handleiding met de uitleg over pauzeren en doorgaan, en andere flow control-statements:

http://docs.python.org/tutorial/controlflow.html

BEWERKT: Zoals een commentator opmerkte, maakt dit alleen een einde aan de binnenste lus. Als je beide lussen moet beëindigen, is er geen “gemakkelijke” manier (anderen hebben je een paar oplossingen gegeven). Een mogelijkheid zou zijn om een ​​uitzondering te maken:

def f(L, A):
    try:
        n=L[0][0]
        m=len(A)
        for i in range(m):
             for j in range(m):
                 if L[i][j]!=n:
                     raise RuntimeError( "Not equal" )
        return True
    except:
        return False

Antwoord 8

Ik weet dat deze vraag lang geleden is gesteld, maar als dat iemand anders kan helpen, hier is mijn antwoord:

Ik vind het gemakkelijker te begrijpen met het gebruik van een while-lus en het zal beide for-lussen op die manier stoppen. De onderstaande code retourneert ook de True/False zoals gevraagd wanneer de functie check_nxn_list()wordt aangeroepen. Sommige parameters moeten mogelijk worden toegevoegd in de functieaanroep.

def check_nxn_list():
    state = True
    n=L[0][0]
    m=len(A)
    while state == True:
        for i in range(m):
            for j in range(m):
                if L[i][j]!=n:
                    state = False
        break
    return state

De breakaan het einde van de while-lus is vereist om de lus te beëindigen, zelfs als de stateblijft Waar.


Antwoord 9

Om je lus te stoppen, kun je breakgebruiken met label. Het zal je lus zeker stoppen. Code is geschreven in Java, maar de aanpak is hetzelfde voor alle talen.

public void exitFromTheLoop() {
    boolean value = true;
            loop_label:for (int i = 0; i < 10; i++) {
              if(!value) { 
                 System.out.println("iteration: " + i);
              break loop_label;
        }
    }
}   

}

LEAVE A REPLY

Please enter your comment!
Please enter your name here

one + 15 =

Other episodes