Нечетный вложенный цикл не работает должным образом (Python 3.x) - PullRequest
0 голосов
/ 25 июня 2018

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

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 ]

0 голосов
/ 25 июня 2018

Код может нарушать неправильные циклы, Я могу ошибаться .Для цикла 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.

Ссылка

0 голосов
/ 25 июня 2018

При попытке запустить ваш код я обнаружил ошибку 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])
# [...]

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

0 голосов
/ 25 июня 2018

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

...