Нечетный вложенный цикл не работает должным образом (Python 3.x)

Следующий код должен напечатать несколько строк

1
2
3

смешанный с линиями

0

Тем не менее, на самом деле он печатает несколько строк

1
1
1
1
3

смешанный с линиями

0

Код:

boxes = []
for y in range(len(hmap)):
    for x in range(len(hmap[y])):
        w = 4
        h = 4

        minh = hmap[y][x]
        maxh = hmap[y][x]

        htemp = h
        while True:
            if y + htemp > len(hmap): break

            passes = False
            wtemp = w
            while True:
                if x + wtemp > len(hmap[y]): break

                for c in range(x, x+wtemp):
                    for r in range(y, y+htemp):
                        minh = min(minh,hmap[c][r])
                        maxh = max(maxh,hmap[c][r])

                        if maxh - minh > v:
                            print('1')
                            break
                    else:
                        print('2')
                        break
                else:
                    print('3')
                    break

                print('0')
                passes = True
                wtemp += 1

            if passes:
                boxes.append([x,y,wtemp-1,htemp])

            htemp += 1

            if not passes: break
  • hmap это двумерный массив значений с плавающей точкой, который передается функции, в которой находится этот код.

Этот сегмент кода должен генерировать серию прямоугольников для других (не относящихся к делу) частей кода для использования в дальнейшем. Прямоугольники, которые "проходят" (минимальные / максимальные значения не имеют разницы больше, чем v) причина

0

быть напечатанным. Прямоугольники, которые не "проходят" должны вызывать

1
2
3

быть напечатанным как вложенный for а также while петли ломаются. Почему это не работает?

3 ответа

Решение

При попытке запустить ваш код я столкнулся с IndexError: list index out of range ошибка. Похоже, что вы могли транспонировать свои столбцы и индексы строк. Попробуйте изменить [c][r] подписки на [r][c]:

# [...]
            for c in range(x, x+wtemp):
                for r in range(y, y+htemp):
                    minh = min(minh,hmap[r][c])
                    maxh = max(maxh,hmap[r][c])
# [...]

Я не уверен, является ли это причиной неправильных разрывов / отпечатков, но это, безусловно, может иметь значение.

Код может нарушать неправильные циклы, я могу ошибаться. Для цикла while создайте логическую переменную и установите для нее значение true. Затем внутри цикла while используйте оператор if, чтобы сделать его ложным, когда вы этого хотите.

top_loop, bottom_loop = True, True
while top_loop:
    # do something
    while bottom_loop:
        # do something
        if condition:
            top_loop = False

Я еще не думал о циклах for. Здесь есть ответ по этой ссылке с именами для циклов и разрывом для циклов. Он использует библиотеку contextlib.

Ссылка на сайт

Похоже, отступ в ваших блоках кода неверен. Есть else заявления в соответствии с for операторы и т. д. Python использует отступы для разделения блоков кода, как это. Еще раз проверьте, что все выровнено правильно, либо в вашем коде, либо в том, что вы скопировали здесь. Если отступ в данном вопросе неверен, отредактируйте его.

Другие вопросы по тегам