Определение соседей ячейки двумерного списка - PullRequest
9 голосов
/ 25 октября 2009

У меня есть список списков, что-то вроде

[[1, 2, 3,],[4, 5, 6,],[7, 8, 9]].

Графически представлен как:

1 2 3
4 5 6
7 8 9

Я ищу элегантный подход к проверке значения соседей ячейки по горизонтали, вертикали и диагонали. Например, соседями [0] [2] являются [0] [1], [1] [1] и [1] [2] или числа 2, 5, 6.

Теперь я понимаю, что могу просто атаковать грубой силой, проверяя каждое значение а-ля:

[i-1][j]
[i][j-1]
[i-1][j-1]
[i+1][j]
[i][j+1]
[i+1][j+1]
[i+1][j-1]
[i-1][j+1]

Но это легко, и я подумал, что могу узнать больше, увидев более элегантные подходы.

Ответы [ 12 ]

0 голосов
/ 25 октября 2009

Генерирует все индексы:

def neighboring( array ):
    nn,mm = len(array), len(array[0])
    offset = (0,-1,1) # 0 first so the current cell is the first in the gen
    indices = ( (i,j) for i in range(nn) for j in range(mm) )
    for i,j in indices:
        all_neigh =  ( (i+x,j+y) for x in offset for y in offset )
        valid = ( (i,j) for i,j in all_neigh if (0<=i<nn) and (0<=j<mm) ) # -1 is a valid index in normal lists, but not here so throw it out
        yield valid.next(), valid ## first is the current cell, next are the neightbors

for (x,y), neigh in neighboring( l ):
    print l[x][y], [l[x][y] for x,y in neigh]
0 голосов
/ 25 октября 2009
>>> import itertools
>>> def sl(lst, i, j):
    il, iu = max(0, i-1), min(len(lst)-1, i+1)
    jl, ju = max(0, j-1), min(len(lst[0])-1, j+1)
    return (il, iu), (jl, ju)

>>> lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> tup = 0, 2
>>> [lst[i][j] for i, j in itertools.product(*sl(lst, *tup)) if (i, j) != tup]
[2, 5, 6]

Я не знаю, как это выглядит элегантно, но кажется, что оно работает без какого-либо жесткого кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...