for row in b:
for drug in drug_input:
for brand in brand_names[drug]:
从第三个循环如何退出当前循环并转到for row in b:
的下一个值?
答案 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)
如果您在一种方法中有三个循环级别,那么您可能需要重新考虑您的设计。
执行其中任何一项都意味着您不再有此问题。
答案 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)
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
现在,或许重新制定这样的逻辑很棘手,但我敢打赌,重构会有其他方面的帮助。