1

我以这种方式在列表中表示 python 中的图形:

[[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 组合为行和列。但似乎很自然地适合在 for 循环中放置边界约束的 C 解决方案。

是否有一种 Pythonic 方法可以在不检查所有 8 种可能选择的边界约束的情况下做到这一点。

没有我需要的订单。这里的矩阵可以是任意 mx n。

4

1 回答 1

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]
于 2013-10-13T17:48:07.607 回答