for row in b:
for drug in drug_input:
for brand in brand_names[drug]:
от третьего цикла, как я выхожу из токовой петли и перехожу к следующему значению for row in b:
?
Здесь используется логическое значение, чтобы увидеть, закончили ли вы еще:
done = False
for x in xs:
for y in ys:
if bad:
done = True
break
if done:
break
Это будет продолжить
, если не было использовано никакого прерывания. else
будет пропущен, если был разрыв, поэтому он увидит следующий разрыв
. Преимущество этого подхода в том, что он не использует переменную, но некоторым может быть труднее читать.
for x in xs:
for y in ys:
if bad:
break
else:
continue
break
Если у вас есть три уровня зацикливания в одном методе, вам, вероятно, нужно переосмыслить свой дизайн.
all
и any
, чтобы избежать написания явных циклов. Выполнение любого из этих действий должно означать, что у вас больше нет этой проблемы.
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
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 нет управляющей структуры для выхода из двух циклов одновременно, поэтому вам нужно сделать что-то вручную, например.
Я бы подумал о том, чтобы поместить два внутренних цикла в функцию и использовать return оттуда. Возможно, переосмысление того, что вы делаете и как, дает лучшую альтернативу этому.
Не могли бы вы указать свой текущий псевдокод, ввод и вывод, чтобы мы могли в первую очередь избавиться от необходимости в перерыве? Нам нужно увидеть, где используются переменные цикла или, что еще лучше, какова цель обработки.
Последний 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
Untested:
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
попробуйте
/ , кроме
/ Raise
, как предложено в комментарии @gddc, это одна из возможностей. Другой - «обернуть» два вложенных цикла в один:
for row in b:
for brand in (b for d in drug_input for b in brand_names[d]):
...
теперь break
из для бренда
вложенного цикла вернется к для строки
уровень внешнего цикла. Конечно, это работает только в том случае, если код, который здесь заменен на ...
, не должен видеть имя препарата
, связанное с лекарством, которое в настоящее время исследуется. Это ваш случай?
Обработка исключений побеждает установку переменных повсюду 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