python 在列表列表中查找给定节点的所有邻居

标签 python list gridview nearest-neighbor

我正在尝试找到一种方法来查找列表列表中给定节点的所有邻居。该数组如下所示:

0,2,4,1,6,0,0
2,0,0,0,5,0,0
4,0,0,0,5,5,0
1,0,0,0,1,1,0
6,5,0,1,0,5,5
0,0,5,1,5,0,0
0,0,0,0,5,0,0

到目前为止我的代码是:

#!/usr/bin/python

#holds all source nodes
source = []

#read in and store the matrix
def create_matrix(file):
    with open('network.txt') as f:
        Alist = []
        for line in f:
            part = []
            for x in line.split(','):
                part.append(int(x))
            Alist.append(part)
    return Alist

def check_neighbours(Alist):
    i = iter(Alist)
    item = i.next()
    source.append(item)
    print source

file = ("F:/media/KINGSTON/Networking/network.txt")
Alist = create_matrix(file)
check_neighbours(Alist)

显然这只会输出矩阵的第一行,但我想要一些不同的东西。例如,我将从节点 [0,0] 开始,它是 0,然后找到 [0,1] 和 [1,0]。但如果我不在矩阵的边缘,我还需要查看 3x3 半径。我知道如何找到当前节点右侧的下一个邻居,但我真的不确定如何找到节点旁边的任何内容,其中也包括对角线节点。

最佳答案

您需要一个 8 邻域算法,它实际上只是从列表列表中选择索引。

# i and j are the indices for the node whose neighbors you want to find
def find_neighbors(m, i, j, dist=1):
    return [row[max(0, j-dist):j+dist+1] for row in m[max(0, i-1):i+dist+1]]

然后可以通过以下方式调用:

m = create_matrix(file)
i = some_y_location
j = some_x_location
neighbors = find_neighbors(m, i, j)

没有列表压缩的实现:

def find_neighbors(m, i, j, dist=1):
    neighbors = []
    i_min = max(0, i-dist)
    i_max = i+dist+1
    j_low = max(0, j-dist)
    j_max = j+dist+1
    for row in m[i_min:i_max]:
        neighbors.append(row[j_min:j_max])
    return neighbors

您需要对 i/j_min 进行最大调用以避免负索引,但过大的上限值会由列表切片自动处理。

如果您希望这些行列表作为单个元素列表,您需要添加:

neighbors = [elem for nlist in neighbors for elem in nlist]

这会展平列表的列表。

如果您想要邻居的指标(可能有更清洁的解决方案):

def find_neighbor_indices(m, i, j, dist=1):
    irange = range(max(0, i-dist), min(len(m), i+dist+1))
    if len(m) > 0:
        jrange = range(max(0, j-dist), min(len(m[0]), j+dist+1))
    else:
        jrange = []
    for icheck in irange:
        for jcheck in jrange:
            # Skip when i==icheck and j==jcheck
            if icheck != i or jcheck != j:
                neighbors.append((icheck, jcheck))
    return neighbors

关于python 在列表列表中查找给定节点的所有邻居,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15913489/

相关文章:

python - Pygame 键盘输入事件滞后

python - 删除 CSV 文件中不需要的行

c# - 如何从另一个 List<int[]> 中删除 List<int[]>

c# - .NET 列表上的随机访问很慢,但如果我总是引用第一个元素怎么办?

javascript - 在Gridview中获取文本框的客户端ID

c# - 访问用于绑定(bind) gridview 的数据或数据项

Python3.9 malloc : can't allocate region error 3

python - 类型错误:只能将元组(不是 "float")连接到元组

python - 如何从字典元组中删除字典项?

c# - 如何在 c# 中删除没有 SqlDataSource 的 gridview 中的行?