Подтвердить что ты не робот

Как остановить цикл 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. Как я могу это реализовать?

4b9b3361

Ответ 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

Ответ 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;