Как остановить цикл for
Я пишу код, чтобы определить, является ли каждый элемент в моем списке nxn одинаковым. то есть [[0,0], [0,0]] возвращает значение true, но [[0,1], [0,0]] вернет значение false. Я думал о написании кода, который немедленно останавливается, когда находит элемент, который не совпадает с первым элементом. то есть:
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-
Я хотел бы остановить этот цикл, если L[i][j]!==n
и вернуть false. иначе верните true. Как я могу это реализовать?
Ответы
Ответ 1
Используйте break
и continue
для этого. Разрыв вложенных циклов можно выполнить в Python, используя следующее:
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
Другой способ - обернуть все в функцию и использовать return
для выхода из цикла.
Ответ 2
Есть несколько способов сделать это:
Простой способ: контрольная переменная
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
Плюсы: легко понять
Минусы: дополнительный условный оператор для каждого цикла
Хакерный путь: создание исключения
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
Плюсы: очень простые
Минусы: вы используете Exception вне своей семантической
Чистый способ: выполнить функцию
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"
профи: намного чище и по-прежнему эффективно
минусы: все же кажется, что C
Питонический путь: используйте итерацию, как и должно быть
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"
профи: все еще чистые и эффективные
минусы: вы восстанавливаете колесо
Способ гуру: используйте 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"
профессионалы: вы почувствуете себя обладающими темными силами
минусы: люди, которые прочитают код, могут вас не любить.
Ответ 3
Попробуйте просто использовать break.
Также вы можете использовать следующий код в качестве примера:
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)
Ответ 4
Чтобы выпрыгнуть из цикла, вам нужно использовать оператор break.
n=L[0][0]
m=len(A)
for i in range(m):
for j in range(m):
if L[i][j]!=n:
break;
Здесь у вас есть официальное руководство Python с объяснением о разрыве и продолжении, а также другие инструкции по управлению потоком:
http://docs.python.org/tutorial/controlflow.html
EDITED: как заметил комментатор, это только завершает внутренний цикл. Если вам нужно прекратить оба цикла, нет "простого" способа (другие дали вам несколько решений). Одной из возможностей было бы создание исключения:
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
Ответ 5
Используйте оператор break: http://docs.python.org/reference/simple_stmts.html#break
Ответ 6
Другие способы сделать то же самое:
el = L[0][0]
m=len(L)
print L == [[el]*m]*m
Или:
first_el = L[0][0]
print all(el == first_el for inner_list in L for el in inner_list)
Ответ 7
Чтобы достичь этого, вы бы сделали что-то вроде:
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;