【问题标题】:how to stop a for loop如何停止 for 循环
【发布时间】:2011-06-14 16:00:42
【问题描述】:

我正在编写一个代码来确定我的 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,我想停止此循环。否则返回真。我将如何实施?

【问题讨论】:

    标签: python


    【解决方案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 退出循环。

    【讨论】:

    • 哇,希望 C# 有 for...else 构造!
    • 哦,我希望 C++、Java、.. 也一样 :-)
    • 我试图让函数在休息前返回一个值,但我不断收到警告说永远不会达到休息时间
    • +1 的创意答案,但这真的值得吗?如果找到,您可以简单地制作:break。更短,更容易阅读。
    • 最好的办法是,重新输入,不要尝试复制和粘贴 - Python 严重解决缩进问题。
    【解决方案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
    

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

    hacky 方式:引发异常

    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"
    

    优点:你会感到被黑暗力量赋予了力量 缺点:阅读你代码的人可能会开始不喜欢你

    【讨论】:

    • 大师之路+1(不,好的答案,但真的很喜欢大师之路的利弊)
    • 我喜欢 hacky 的方式。
    【解决方案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】:

      【讨论】:

        【解决方案5】:

        其他的方法是:

        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】:

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

          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】:

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

            【讨论】:

            • 你只是打破了内部 for 循环,使用分号是不必要且丑陋的。
            【解决方案8】:

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

            我发现使用 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
            

            while 循环结束时的 break 是结束循环所必需的,即使 state 保持不变是的。

            【讨论】:

              【解决方案9】:

              要停止循环,您可以使用 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;
                      }
                  }
              }   
              

              }

              【讨论】:

              • 看起来您的答案是用 C++ 或 JS 编写的,但问题是用 Python 编写的
              • 您好 Falco,欢迎来到 SO。请在您的答案中花时间并正确格式化代码。你可以edit它。
              猜你喜欢
              • 2022-01-11
              • 1970-01-01
              • 2021-04-16
              • 1970-01-01
              • 2016-03-10
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多