获取网格节点的邻居

2024-04-26 03:28:40 发布

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

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

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)]..}

如您所见,(row,column)元组中的row部分始终为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条回答
网友
1楼 · 发布于 2024-04-26 03:28:40

在网格中迭代时,使用^{}获取包含元素索引和元素的元组:

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

相关问题 更多 >

    热门问题