细胞二维lis邻域的确定

2024-04-28 07:23:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个清单,比如

[[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。

现在我意识到我可以做一次暴力攻击来检查每一个la值:

[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]

但这很简单,我想我可以通过看到一些更优雅的方法来学习更多。


Tags: 方法图形水平数字la邻域单元意识
3条回答

mb。。。

from itertools import product, starmap

x, y = (8, 13)
cells = starmap(lambda a,b: (x+a, y+b), product((0,-1,+1), (0,-1,+1)))

// [(8, 12), (8, 14), (7, 13), (7, 12), (7, 14), (9, 13), (9, 12), (9, 14)]
print(list(cells)[1:])

假设你有一个方阵:

from itertools import product

size = 3

def neighbours(cell):
    for c in product(*(range(n-1, n+2) for n in cell)):
        if c != cell and all(0 <= n < size for n in c):
            yield c

使用^{}并感谢Python的yield expressionstar operator,该函数很漂亮dry,但仍然足够可读。

如果矩阵大小为3,则可以(如果需要)收集list中的邻居:

>>> list(neighbours((2,2)))
[(1, 1), (1, 2), (2, 1)]

函数的功能可以可视化如下:

Function visualization

# Size of "board"
X = 10
Y = 10

neighbors = lambda x, y : [(x2, y2) for x2 in range(x-1, x+2)
                               for y2 in range(y-1, y+2)
                               if (-1 < x <= X and
                                   -1 < y <= Y and
                                   (x != x2 or y != y2) and
                                   (0 <= x2 <= X) and
                                   (0 <= y2 <= Y))]

>>> print(neighbors(5, 5))
[(4, 4), (4, 5), (4, 6), (5, 4), (5, 6), (6, 4), (6, 5), (6, 6)]

我不知道这是否被认为是干净的,但是这一行程序通过迭代它们并丢弃任何边的情况来给所有的邻居。

相关问题 更多 >