如何停止for循环

时间:2011-06-14 16:00:42

标签: python

我正在编写一个代码来确定我的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。我将如何实现这一目标?

9 个答案:

答案 0 :(得分:71)

使用breakcontinue执行此操作。可以使用以下命令在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从循环中逃脱。

答案 1 :(得分:45)

有几种方法可以做到:

简单方法:一个哨兵变量

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

优点:易于理解 缺点:每个循环的附加条件语句

hacky Way:提出异常

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

pythonic方式:使用迭代,因为它应该是

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"
专业人士:你会感受到黑暗势力的能力 缺点:会读你代码的人可能会开始不喜欢你

答案 2 :(得分:2)

尝试简单地使用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)

答案 3 :(得分:0)

为了跳出循环,你需要使用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手册,其中包含有关break和continue的说明以及其他流控制语句:

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

编辑:正如评论者指出的那样,这只会结​​束内循环。如果你需要终止两个循环,没有“简单”的方法(其他人已经给你一些解决方案)。一种可能性是提出异常:

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

答案 4 :(得分:0)

答案 5 :(得分:0)

其他方法也是如此:

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)

答案 6 :(得分:0)

要实现这一目标,您可以执行以下操作:

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;

答案 7 :(得分:0)

我知道这个问题很久以前就有人问过了,但如果这可以帮助其他人,那么我的答案是:

我发现使用 while 循环更容易理解,它会以这种方式停止两个 for 循环。当调用函数 check_nxn_list() 时,下面的代码也返回 True/False。可能需要在函数调用中添加一些参数。

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

break 需要在 while 循环结束时结束循环,即使 state 保持不变正确

答案 8 :(得分:-1)

要停止循环,可以将 break label 一起使用。它将确保停止您的循环。代码是用Java编写的,但是所有语言的方法都是相同的。

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;
        }
    }
}   

}