如何停止for循环

问题描述:

我正在编写代码以确定我的nxn列表中的每个元素是否相同。即[[0,0],[0,0]]返回true,但[[0,1],[0,0]]将返回false。我正在考虑编写一个代码,当它发现一个与第一个元素不相同的元素时立即停止。即:如何停止for循环

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。我将如何去实施这个?

使用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从环逃脱。

+3

哇,希望C#有'for ... else'构造! – Blindy 2011-06-14 16:06:37

+2

哦,我希望对于C++,Java也是如此...... :-) – 2011-06-14 16:09:54

+0

我试图让函数在休息之前返回一个值,但我不断收到一个警告,表示休息永远不会到达 – LostLin 2011-06-14 16:13:12

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

为了跳出循环,您需要使用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

编辑:作为一个评论者指出的那样,这并不只是结束内循环。如果您需要终止两个循环,则没有“简单”的方法(其他人已经给出了一些解决方案)。其中一个方法可行。将引发异常:

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 
+0

你打破了循环的内在,使用分号是不必要的和丑陋的。 – utdemir 2011-06-14 16:14:28

其他的方式做同样的是:

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) 

为了达到这个目的,你可以这样做:

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; 

有几种方法可以做到这一点:

最简单的方法:定点变量

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 

优点:非常简单 缺点:使用异常的语义

的清洁方式之外:做一个功能

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

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

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" 

个优点:还算干净,高效的 缺点:你reinvdent轮

的大师方式:使用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" 

优点:人们会读你:你会觉得与黑暗的力量 利弊授权代码可能会开始不喜欢你

+1

+1为guru的方式(没有好,无论如何伟大的答案,但真正喜欢古鲁的方式的利弊) – JMax 2014-08-26 08:40:08