获取网格节点的邻居

时间:2021-04-09 14:00:00

标签: python matrix pygame grid

我正在做一个寻路可视化工具,我需要获取节点的邻居,以便对它们执行我想要制作邻​​接列表的算法,然后只更新颜色,但问题是当我尝试用一个节点的行和列及其邻居输出错误的东西,我将解释我的意思以及为什么会发生问题我只是不知道如何阻止它:

def get_neighbors(grid):
    neighbors = {}

    for row in grid:
        for col in row:
            directions = [(grid.index(row) + 1, row.index(col)), (grid.index(row) - 1,row.index(col)), (grid.index(row), row.index(col) - 1), (grid.index(row), row.index(col) + 1)]
            neighbors[row.index(col)] = [directions[0], directions[1], directions[2], directions[3]]
    return neighbors

我知道有更好的方法来实现我尝试做的事情,即在矩阵中取一个节点并为该节点分配一个键,其值是矩阵中该点的上下左右节点,所以如果有人能提出更好的方法并写作,我将不胜感激。

我对这个实现的问题是它输出以下内容(我只会给出几个例子而不是整个输出,因为它太多了):

{0: [(20, 0), (18, 0), (19, -1), (19, 1)], 1: [(20, 1), (18, 1), (19, 0), (19, 2)], 2: [(20, 2), (18, 2), (19, 1), (19, 3)]..}

如您所见,(行,列)元组中的行部分始终为 20,因为这是网格中的总行数,因此问题在于它输出仅位于最后一行的行的索引迭代 我怎样才能让我的输出看起来像这样:

{0: [(1, 0), (-1, 0), (0, -1), (0, 1)], 1: [(2, 1), (0, 1), (1, 0), (1, 2)], 2: [(3, 2), (1, 2), (2, 1), (2, 3)]

所以基本上使行的工作方式与此特定示例中的列的工作方式相同

1 个答案:

答案 0 :(得分:1)

使用 enumerate 获取包含元素索引和元素索引的元组:

def get_neighbors(grid):
    neighbors = {}
    for j, row in enumerate(grid):
        for i, col in enumerate(row):
            neighbors[len(neighbors)] = [(i+1, j), (i-1, j), (i, j-1), (i, j+1)]
    return neighbors