Несколько вложенных циклов for, переход к следующей итерации внешнего цикла, если условие внутри внутреннего цикла истинно

Я знаю, что это ужасно неэффективный и уродливый код, но если у меня есть три цикла for, вложенных друг в друга, например так:

for x in range(0, 10):
    for y in range(x+1, 11):
       for z in range(y+1, 11):
           if ...

Я хочу разорвать два внутренних цикла и перейти к следующей итерации внешнего цикла, если оператор if верен. Можно ли это сделать?


person KOB    schedule 11.01.2016    source источник


Ответы (3)


Проверьте некоторую переменную после завершения каждого цикла:

for x in range(0, 10):
    for y in range(x+1, 11):
        for z in range(y+1, 11):
            if condition:
                variable = True
                break
            #...
        if variable:
            break;
        #...
person tglaria    schedule 11.01.2016

Другой вариант — использовать исключения вместо переменных состояния:

class BreakException(Exception):
    pass

for x in range(0, 10):
    try:
        for y in range(x+1, 11):
           for z in range(y+1, 11):
               if True:
                   raise BreakException
    except BreakException:
        pass

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

person kazemakase    schedule 11.01.2016

Возможным решением является объединение двух внутренних циклов в один (который можно завершить с помощью break):

import itertools

for x in range(10):
    for y, z in itertools.combinations(range(x+1, 11), 2):
        if condition:
            break
person William    schedule 11.01.2016