Python: выход из двух циклов

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

от третьего цикла, как я выхожу из токовой петли и перехожу к следующему значению for row in b: ?

26
задан l--''''''---------'''''''''''' 28 July 2010 в 20:33
поделиться

9 ответов

Здесь используется логическое значение, чтобы увидеть, закончили ли вы еще:

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
30
ответ дан 28 November 2019 в 06:31
поделиться

Если у вас есть три уровня зацикливания в одном методе, вам, вероятно, нужно переосмыслить свой дизайн.

  • Разделите свой метод на более мелкие и простые.
  • Используйте понимание списка и такие методы, как all и any , чтобы избежать написания явных циклов.

Выполнение любого из этих действий должно означать, что у вас больше нет этой проблемы.

6
ответ дан 28 November 2019 в 06:31
поделиться
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
2
ответ дан 28 November 2019 в 06:31
поделиться
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 нет управляющей структуры для выхода из двух циклов одновременно, поэтому вам нужно сделать что-то вручную, например.

7
ответ дан 28 November 2019 в 06:31
поделиться

Я бы подумал о том, чтобы поместить два внутренних цикла в функцию и использовать return оттуда. Возможно, переосмысление того, что вы делаете и как, дает лучшую альтернативу этому.

Не могли бы вы указать свой текущий псевдокод, ввод и вывод, чтобы мы могли в первую очередь избавиться от необходимости в перерыве? Нам нужно увидеть, где используются переменные цикла или, что еще лучше, какова цель обработки.

5
ответ дан 28 November 2019 в 06:31
поделиться

Последний 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
4
ответ дан 28 November 2019 в 06:31
поделиться

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 
2
ответ дан 28 November 2019 в 06:31
поделиться

попробуйте / , кроме / Raise , как предложено в комментарии @gddc, это одна из возможностей. Другой - «обернуть» два вложенных цикла в один:

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

теперь break из для бренда вложенного цикла вернется к для строки уровень внешнего цикла. Конечно, это работает только в том случае, если код, который здесь заменен на ... , не должен видеть имя препарата , связанное с лекарством, которое в настоящее время исследуется. Это ваш случай?

2
ответ дан 28 November 2019 в 06:31
поделиться

Обработка исключений побеждает установку переменных повсюду 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
6
ответ дан 28 November 2019 в 06:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: