我需要以如下所示的模式连接这些节点:
所有的节点(圆圈)都存储在一个列表中,然后我有一个2d列表,其中有一对数字,这些数字指的是节点的索引,并显示它们之间的连接。为了创建图中所示的排列,我手动将连接列表存储在一个变量中。
我希望有一种方法可以接收这个点列表,然后返回这个所有点连接的列表,这对任何数量的点都有效。
我试图通过使用itertools组合来实现:
connections=list(combinations(points, 2))
# draw combinations with lines between each point pair
结果:
它给了我错误的结果,正如你所看到的,有太多的连接,它不遵循上面的例子中显示的模式,我手动给出了连接。
3条答案
按热度按时间wswtfjt71#
需要显式指定边。
对于坐标
(i, j)
处的每个点,存在到其东(i, j+1)
的点的水平边、到其南(i+1, j)
的点的垂直边、到其东南(i+1, j+1)
的点的对角边以及到其东北(i-1,j+1)
的点的对角边。测试:
db2dz4w82#
具有显式边的答案已经存在。
另一方面,您可能不需要显式地指定边--以及节点。
考虑下面的方法,一个节点就是一对
(row, col)
和一个网格坐标,一个连接并不存储在任何地方:相反,对于每个节点,其邻居是即时生成的。下面是第二张图片的示例:
下面是它打印的邻居:
这里的要点是,当我们每次需要连接时都可以动态生成它们时,通常不需要“存储”连接。大多数图算法(从BFS、DFS和最短路径开始)依赖于“对于此节点的每个邻居,执行此操作”形式的基本操作。在代码中,此短语可以替换为:
jhkqcmku3#
正如@luk2302所说,你可以迭代所有的点,并将(x,y)连接到(x+1,y)、(x,y+1)、(x+1,y+1)和(x+1,y-1)。此外,如果你想存储点之间的连接列表,我建议使用字典形式的邻接列表。
最后得到的是一个名为
connections
的字典,其中connections[(x,y)]
将返回该点连接到的所有其他元组的列表。例如,
connections[(0,0)]
将返回[(1,0), (0,1), (1,1)]
。如果你只想画网格而不做任何操作,你也可以删除每个“if”语句的第二行。