Нечетный вложенный цикл не работает должным образом (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 использует отступы для разделения блоков кода, как это. Еще раз проверьте, что все выровнено правильно, либо в вашем коде, либо в том, что вы скопировали здесь. Если отступ в данном вопросе неверен, отредактируйте его.