Find neighbors of the matrix element at the given position
I force myself to learn something but before learning something new I need to memorize what I knew before. So I take python labs at exercism.org.
In one of the labs I had a chllange to find the neighour elements of the matrix element at the given position so I decided to save the solution for further refference.
For example given the matrix:
matrix = [
"123",
"456",
"789"
]
I need to build the function that takes the the following arguments:
- matrix
- element position (x, y as a separate arguments)
The function should return all the elements arround the specified coordinates.
For example:
- if I specify
x=0
,y=1
that corrensponds with the “2” the function should return 1,3,4,5,6 - if I specify
x=1
,y=1
that corrensponds with the “5” the function should return 1,3,4,6,7,8,9
The logics is fairy simple:
- loop over rows in range x-1, x+2
- loop over columns in range y-1, y+2
- row index should be
>0
and<len(row)
- column index should be
>0
and<num(columns)
or<len(row[0])
- exclude the element at specified position
def get_neighbors(matrix, x, y):
num_rows, num_cols = len(matrix), len(matrix[0])
for i in range( (0 if x-1 < 0 else x-1), (num_rows if x+2 > num_rows else x+2), 1 ):
for j in range( (0 if y-1 < 0 else y-1), (num_cols if y+2 > num_cols else y+2), 1 ):
if matrix[x][y] != matrix[i][j]:
print(" • matrix["+str(i)+"]["+str(j)+"] = "+str(matrix[i][j]))
This example prints the values but it is possible to build the list()
with the discovered values.
def get_neighbors(matrix, x, y):
num_rows, num_cols = len(matrix), len(matrix[0])
result =[]
for i in range( (0 if x-1 < 0 else x-1), (num_rows if x+2 > num_rows else x+2), 1 ):
for j in range( (0 if y-1 < 0 else y-1), (num_cols if y+2 > num_cols else y+2), 1 ):
if matrix[x][y] != matrix[i][j]:
result.append(matrix[i][j])
return result
Another option is to build the dict()
object using the discovered value as a key and cooridinates as a values.
def get_neighbors(matrix, x, y):
num_rows, num_cols = len(matrix), len(matrix[0])
result = dict()
for i in range( (0 if x-1 < 0 else x-1), (num_rows if x+2 > num_rows else x+2), 1 ):
for j in range( (0 if y-1 < 0 else y-1), (num_cols if y+2 > num_cols else y+2), 1 ):
if matrix[x][y] != matrix[i][j]:
result[matrix[i][j]] = [i,j]
return result
Or you can do whatever modifications with the original mattrix you’d like to inside this function and return it as a result.