@OpenYouEyes20

Как обойти выход за границы двумерного массива?

Есть двумерный массив.
Мне нужно вывести всех его его соседей по координатам, в процессе вывода возникает ошибка:
IndexError: list index out of range
Как ее обойти, чтобы мой код доработал до конца вывел 27 элементов принтом.
b =   [[9, 5, 3],[0, 7, -1],[-5, 2, 9]]                
for i in range(len(b)):              
    for j in range(len(b[i])):     
        print(b[i-1][j])             
        print(b[i+1][j])             
        print(b[i][j-1])             
        print(b[i][j+1])
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
@OpenYouEyes20 Автор вопроса
Ну и намудрили вы ребята! Внимательно условие читаем : обход границ , вывод 27 принтов

Вот правильный код:

b =   [[9, 5, 3],[0, 7, -1],[-5, 2, 9]]
for i in range(len(b)):
    for j in range(len(b[i])):
        print(b[i-1][j])
        print(b[(i+1) % len(b)][j])
        print(b[i][j-1])
        print(b[i][(j+1) % len(b[i])])

всем спасибо!
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Wispik
1. Добавить элементарную проверку:
if i < len(b)-1:
    print(b[i+1][j])

2. Использовать try except и обрабатывать ошибку IndexError
Ответ написан
Комментировать
Vindicar
@Vindicar
3. Исправить циклы
range(1, len(b) - 1)
range(1, len(b[i]) - 1)
Ответ написан
Комментировать
@dmshar
Ну, я бы делал так:
def neighbors(arr,row,column):
    rows=len(arr)
    columns=len(arr[0])
    for i in range (row - 1,row + 2):
        for j in range(column - 1,column + 2):
            if (j >= 0 and i >= 0 and j < columns and i < rows and (not(i == row and j == column))):
                print (arr[i][j])
    return 
b =   [[9, 5, 3],[0, 7, -1],[-5, 2, 9]]   
desk=[item for sublist in b for item in sublist]
for ind0, elt0 in enumerate(b):
    for ind1,elt1 in enumerate( elt0):
        print (ind0,ind1,'------',elt1)
        neighbors(b,ind0,ind1)


Результат:
0 0 ------ 9
5
0
7
0 1 ------ 5
9
3
0
7
-1
0 2 ------ 3
5
7
-1
1 0 ------ 0
9
5
7
-5
2
1 1 ------ 7
9
5
3
0
-1
-5
2
9
1 2 ------ -1
5
3
7
2
9
2 0 ------ -5
0
7
2
2 1 ------ 2
0
7
-1
-5
9
2 2 ------ 9
7
-1
2

А при использовании numpy можно бы сделать немного быстрее и элегантнее.
Приведен самый общий случай. В случае необходимости "соседи по диагонали" тоже легко убираются.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы