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]!==n
en false retourneren. geef anders true terug. Hoe zou ik dit gaan implementeren?
Antwoord 1, autoriteit 100%
Gebruik break
en continue
om 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 return
te 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;
}
}
}
}