2014-11-19 3 views
0

Я создаю простую программу, которая работает с использованием окрестности Мура. Поэтому, учитывая сетку, строку и столбец, она должна возвращать количество ячеек в окрестности позиции, которая содержит 1. Она работает, за исключением случаев, когда задана позиция на краю сетки. Поскольку он проверяет все окружающие его сетки, он бросает IndexError, когда он пытается проверить позицию за пределами сетки. То, что я хочу, это просто игнорировать его, не останавливаясь, бросая ошибку или манипулируя моими результатами, и переходите к следующему. Но я не уверен, как, я попытался сделать исключение в IndexError, но он выходит из цикла после его обнаружения.Как я могу продолжить цикл обработки исключений?

def count_neighbours(grid, row, col): 
    count = 0 
    pos = grid[row][col] 
    try: 
     for cell in [grid[row+1][col], #(0,-1) All relative to pos 
        grid[row-1][col], #(0,1) 
        grid[row+1][col+1], #(1,-1) 
        grid[row+1][col-1], #(-1,-1) 
        grid[row][col-1], #(-1,0) 
        grid[row][col+1], #(1,0) 
        grid[row-1][col+1], #(1,-1) 
        grid[row-1][col-1]]: #(-1,1) 
      if cell == 1: 
       count += 1 
    except IndexError: 
     pass 
    return count 

assert count_neighbours(((1, 1, 1), 
         (1, 1, 1), 
         (1, 1, 1),), 0, 2) == 3 
+0

Что делать, если я должен был сделать проверку индексов каждой ячейки, и если он Безразлично 't бросать исключение, я добавляю его в список допустимых ячеек? Затем пропустите этот список и проверьте значение? – Jordan

+0

Независимо от того, что еще не так с вашим кодом, обратите внимание, что 'IndexError' _won't_ будет сгенерирован для рассчитанных отрицательных значений 'row ± 1' и' col ± 1', потому что Python позволяет индексы меньше нуля (они обертываются, т. Е. они интерпретируются как значения len (object) + index'). – martineau

+0

P.S. Относительно простое решение проблемы с отрицательными индексами заключалось бы в том, чтобы добавить пустую строку и столбец в вашу «сетку» и использовать индексирование на основе 1 для параметров строки «row» и «col», переданных функции. Таким образом, рассчитанные наименьшие значения смещения будут равны нулю для всех допустимых значений позиции 'row, col', поскольку они всегда будут относиться к пустым ячейкам и поэтому не будут учитываться. – martineau

ответ

1

Цикл остановки, потому что вы оборачивать весь цикл в попытке кроме вас хотят что-то вроде этого

def count_neighbours(grid, row, col):             count = 0                
    pos = grid[row][col]              
    for cell in [[row+1,col], #(0,-1) All relative to pos   
       [row-1,col], #(0,1)         
       [row+1,col+1], #(1,-1)         
       [row+1,col-1], #(-1,-1)        
       [row,col-1], #(-1,0)         
       [row,col+1], #(1,0)         
       [row-1,col+1], #(1,-1)         
       [row-1,col-1]]: #(-1,1)         
     try:                
      temp_cell = grid[cell[0]][cell[1]]         
      if temp_cell == 1:             
       count += 1             
     except IndexError:              
      pass                 
    return count                

assert count_neighbours(((1, 1, 1),           
         (1, 1, 1),           
         (1, 1, 1),), 0, 2) == 3 
+0

Он по-прежнему бросает ту же ошибку, я думаю, из списка в цикле for. И я рисую пробел, могу ли я спросить, что именно ячейка = сетка [ячейка [0], ячейка [1]]? – Jordan

+0

он должен быть сеткой [ячейка [0]] [ячейка [1]] У меня была опечатка, но она захватывает первый и второй элементы каждого списка, что эквивалентно тому, что ваша ячейка в цикле for была сильно названа им что-то другое – user2097159

0

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

Например, вы можете использовать эту функцию:

def compute_coords_around(x, y, boundary): 
    xcoords = [x-1, x, x+1] 
    ycoords = [y-1, y, y+1] 
    valid_coords = [] 

    for xc in xcoords: 
     for yc in ycoords: 
      if xc <= boundary and yc <= boundary: 
       valid_coords.append((xc,yc)) 

    return valid_coords 

и позволяет сказать, что вы хотите проверить на соседних клетках (2, 2) в матрице 3х3. Вы знаете, что максимальное значение столбца или строки равен 2. Таким образом, вы можете:

compute_coords_around(2, 2, 2) 

Это даст вам список:

[(1, 1), (1, 2), (2, 1), (2, 2)] 

в то время как:

compute_coords_around(1, 1, 2) 

дать вам :

[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)] 

Тогда ваш код может быть изменен:

def count_neighbours(grid, row, col): 
    count = 0 
    pos = grid[row][col] 
    for (x, y) in compute_coords_around(row, col, len(grid) - 1) 
     if grid[x][y] == 1: 
      count += 1 
    return count 
0

Вам нужны более мелкозернистая обработка исключений (и ваш алгоритм должен явным образом проверять, в противном случае - правовой в Python - индексы меньше нуля). Вот один из способов достижения как:

OFFSETS = ((-1, -1), (-1, 0), (-1, 1), 
      (0, -1),   (0, 1), 
      (1, -1), (1, 0), (1, 1)) 

def count_neighbours(grid, row, col): 
    count = 0 
    for dr, dc in OFFSETS: 
     try: 
      x, y = row+dr, col+dc 
      if x < 0 or y < 0: # Disallow negative indices. 
       raise IndexError 
      if grid[x][y] == 1: # Could also cause an IndexError. 
       count += 1 
     except IndexError: 
      pass 
    return count 

assert count_neighbours(((1, 1, 1), 
         (1, 1, 1), 
         (1, 1, 1),), 0, 2) == 3 

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

OFFSETS = ((-1, -1), (-1, 0), (-1, 1), 
      (0, -1),   (0, 1), 
      (1, -1), (1, 0), (1, 1)) 

def count_neighbours(grid, row, col): 
    count = 0 
    for dr, dc in OFFSETS: 
     try: 
      if grid[row+dr][col+dc] == 1: 
       count += 1 
     except IndexError: 
      pass 
    return count 

# Note the changed position coordinate arguments. 
assert count_neighbours(((0, 0, 0, 0), 
         (0, 1, 1, 1), 
         (0, 1, 1, 1), 
         (0, 1, 1, 1),), 1, 3) == 3 
Смежные вопросы