2013-10-13 2 views
1

Я представляю график в питоне в списке таким образом:Чтение соседних элементов в графике в питоне

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

То, что я хочу сейчас все соседние элементы конкретного узла?

Для например

1 -> 2, 4, 5 
5 -> 1, 2, 3, 4, 6, 7, 8, 9 

Я понимаю, что способ сделать бы комбинации I-1, I + 1, J-1, J + 1 с I и J в качестве строк и столбцов. Но кажется естественным удовлетворить решение C, где вы помещаете граничные ограничения в циклы for.

Есть ли питонический способ сделать это, не проверяя граничные ограничения для всех 8 возможных вариантов.

Существует никаких заказов, которые мне нужны. Матрица здесь может быть любой m x n.

+0

Ваш пример представляет собой список, не словарь. –

+0

@BasSwinckels Исправлена ​​благодарность. – gizgok

+0

Собственно, теперь, когда я, наконец, понимаю ваш вопрос, кажется, что ваш вложенный список фактически представляет собой матрицу. –

ответ

1

Вы можете использовать itertools.product:

>>> from itertools import product 
>>> lis = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
>>> points = list(product([0, 1, -1], repeat=2))[1:] 
def get_adj_items(i, j, m, n, lis): 
    return [lis[i+x][j+y] for x, y in points 
             if 0 <= x+i < m and 0 <= y+j < n] 
... 
>>> get_adj_items(0, 0, 3, 3, lis) 
[2, 4, 5] 
>>> get_adj_items(1, 1, 3, 3, lis) 
[6, 4, 8, 9, 7, 2, 3, 1] 

2x4 матрицы:

>>> lis = [[1, 2, 3 ,4], [5, 6 ,7 ,8]] 
>>> get_adj_items(1, 1, 2, 4, lis)  #items adjacent to 6 
[7, 5, 2, 3, 1] 
+0

Я упоминаю, чтобы добавить деталь, что матрица не будет 3x3. Будет ли это работать для матрицы mxn. – gizgok

+0

@gizgok Вы находитесь в лучшем положении, чтобы проверить, будет ли это ... – millimoose

+0

@gizgok Да, просто используйте '0 <= x + i

Смежные вопросы