python:退出两个循环

时间:2010-07-28 20:33:24

标签: python

  for row in b:
    for drug in drug_input:
      for brand in brand_names[drug]:

从第三个循环如何退出当前循环并转到for row in b:的下一个值?

11 个答案:

答案 0 :(得分:28)

这个使用布尔值来查看你是否已经完成:

done = False
for x in xs:
    for y in ys:
        if bad:
            done = True
            break

    if done:
        break

如果没有使用中断,这个将continue。如果有中断,则会跳过else,因此会看到下一个break。这种方法的好处是不必使用变量,但可能更难以阅读。

for x in xs:
    for y in ys:
        if bad:
            break
    else:
        continue

    break

答案 1 :(得分:7)

for row in b:
   more_drugs = True
   for drug in drug_input:
      for brand in brand_names[drug]:
          if something:
              more_drugs = False
              break

      if not more_drugs:
          break

Python没有一次性打破两个循环的控制结构,所以你需要像这样手动做一些事情。

答案 2 :(得分:6)

如果您在一种方法中有三个循环级别,那么您可能需要重新考虑您的设计。

  • 将您的方法拆分为更简单,更简单的方法。
  • 使用列表推导和allany等方法来避免编写显式循环。

执行其中任何一项都意味着您不再有此问题。

答案 3 :(得分:6)

异常处理在整个地方设置变量IMO

for row in b:
    for drug in drug_input:
        try:
            for brand in brand_names[drug]:
                if some_condition:
                    raise StopIteration
        except StopIteration:
            break

答案 4 :(得分:5)

我会考虑将两个内部循环置于功能并使用返回。可能会重新思考你在做什么以及如何提供更好的替代方案。

您能否提供当前的伪代码,输入和输出,以便我们可以尝试首先删除中断的必要性?我们需要查看循环变量的使用位置或更好,处理的目标是什么。

答案 5 :(得分:4)

最新的PEP我看到请求此功能是3136(并被拒绝):http://mail.python.org/pipermail/python-3000/2007-July/008663.html

最近与我能看到你想要做的最干净的事情就是做以下事情(因为即使是类型名称都是作用域的,你可以在函数中声明LocalBreak所需的):

class LocalBreak(Exception): pass

try:
   for i in ...:
       for h in ...:
           for j in ...:
              if should_break(j):
                 raise LocalBreak()
except LocalBreak:
   pass

答案 6 :(得分:2)

未测试:

inner_termination=False
for row in b:
    for drug in drug_input:
       for brand in brand_names[drug]:
           <blah>
           if break_condition:
               inner_termination=True
               break 
           <blah>
       if inner_termination:
           inner_termination=False
           break 

答案 7 :(得分:2)

for row in b:
    ok = True
    for drug in drug_input:
        if not ok:
            break;
        for brand in brand_names[drug]:
            if not ok:
                break
            if whatever:
                ok = False

答案 8 :(得分:2)

正如@ gddc的评论中所建议的那样,

try / except / raise是一种可能性。另一个是将两个嵌套循环“包装”成一个:

for row in b:
  for brand in (b for d in drug_input for b in brand_names[d]):
    ...

现在,break嵌套循环中的for brand将返回for row外循环级别。当然,仅当此处由...替换的代码不需要查看与当前正在检查的药物绑定的drug名称时,此方法才有效。那是你的情况吗?

答案 9 :(得分:2)

for a in aa:
     for b in bb:
         for c in cc:
            if c == a[b]:
                break
         else:
             continue
         break

Python支持for...else语句。如果内部else未被触发,则会计算break块。

答案 10 :(得分:2)

如果你有太多的嵌入式循环,可能是重构的时候了。在这种情况下,我相信最好的重构是将循环移动到函数中并使用return语句。这将迫使退出任何数量的循环。例如:

def example(self, drug_input):
    ok = False
    for x in drug_input["names"]:
        for y in range(drug_input["number_of_drugs"]):
            for z in drug_input["list_of_drugs"]:
                # do stuff
                if ok:
                    return drug_costs

现在,或许重新制定这样的逻辑很棘手,但我敢打赌,重构会有其他方面的帮助。