当前位置: 首页 > 面试题库 >

在网格中查找相邻单元格的Python高效方法

穆睿才
2023-03-14
问题内容

我正在使用pyglet /
openGL在Python中构建基于图块的应用,其中我需要查找给定单元的所有相邻单元。我在笛卡尔网格的一个象限中工作。每个像元都有一个x和y值,指示其在网格中的位置(x_coord和y_coord)。这些不是像素值,而是网格位置。我正在寻找一种获取相邻细胞的有效方法。最多有八个可能的相邻像元,但由于网格的边界,可能只有3个。伪代码是一种简单但可能效率不高的方法,如下所示:

def get_adjacent_cells( self, cell ):
     result = []
     x_coord = cell.x_coord
     y_coord = cell.y_coord
     for c in grid.cells:
          if c.x_coord == x_coord and c.y_coord == y_coord: # right
               result.append( c )
          if c.x_coord == x_coord - 1 and c.y_coord == y_coord + 1: # lower right
               result.append( c )
          if c.x_coord == x_coord - 1 and c.y_coord == y_coord: # below
               result.append( c )
          if c.x_coord == x_coord - 1 and c.y_coord == y_coord - 1: lower left
               result.append( c )
          if c.x_coord == x_coord and c.y_coord == y_coord - 1: right
               result.append( c )
          // -- similar conditional for remaining cells

这可能会很好用,尽管此代码可能需要在每个帧中运行,并且在较大的网格中可能会影响性能。有什么想法可以使流程更精简,CPU占用更少?还是我应该采用这种方法?

提前致谢。


问题答案:

对我来说,尚不清楚单元格中是否仅存在x和y坐标以外的其他信息。无论如何,我认为需要更改数据结构以使其更快。

我假设单元格中有额外的信息,并且将其grid.cells作为字典,并且将键作为坐标的元组。grid.cells如果单元格中只有坐标信息,则可以将其作为一个集合来完成。

def get_adjacent_cells( self, x_coord, y_coord ):
    result = {}
    for x,y in [(x_coord+i,y_coord+j) for i in (-1,0,1) for j in (-1,0,1) if i != 0 or j != 0]:
        if (x,y) in grid.cells:
            result[(x,y)] = grid.cells[(x,y)]

根据您要处理的数据的不同,您可能不希望将结果做成字典,但希望您能理解。这应该比您的代码快得多,因为您的代码会对中的每个单元格进行8次检查grid.cells



 类似资料:
  • 我已经编写了一个程序,找到一个包含“customer:”的单元格,并且程序成功地工作。问题是,我想要直接挨着单元格的单元格的值。布局如下所示:

  • 我正在使用顺风CSS,并试图建立一个网格,使某些单元格内容跨越多个单元格,而其他项目留在单个单元格。在下面的代码中,我试图展示我正在尝试完成的事情。我知道我的col-span-2班什么也没做,但我把它放在那里是为了表明我希望我能做什么。我想让所有的单元格都是相同的宽度(我只想让一些单元格内容跨越分隔线)。我需要某种覆盖逻辑吗? 感谢任何帮助。 谢谢!

  • 问题内容: 我在长度为4+的div内有一系列文章,没有任何四舍五入的行标记。我需要将其表示为每行3个文章(列)的表格,大概用display: grid。每篇文章都有一个页眉,一个节和一个页脚。 如何 在每行文章的内部为每个页眉实现相等的高度,为每个部分提供相等的高度以及与文章底部对齐的相等高度的页脚?可能吗 我应该使用display: table吗? PS我需要根据屏幕宽度动态更改每行的文章数。谢

  • 移动国家代码由三位小数组成,移动网络代码由两位或三位小数组成(例如:001的MNC与01的MNC不同)https://en.wikipedia.org/wiki/Mobile_country_code 那么,要将MCC MNC作为一个字符串,您如何在Android中获得手机的MCC和MNC?可用于SIM卡插槽的主服务单元。 但是,我需要相邻单元格的这些值。 返回单元格列表,每个单元格都很好地保存了

  • 本文向大家介绍在JavaScript中查找大于其相邻元素的元素,包括了在JavaScript中查找大于其相邻元素的元素的使用技巧和注意事项,需要的朋友参考一下 我们需要编写一个JavaScript函数,该函数将数字数组作为第一个也是唯一的参数。 函数应从数组中查找并返回一个大于两者的数字,该数字应位于其直接右侧和左侧。如果数组中存在多个这样的元素,则我们的函数应返回其中任何一个。 例如- 如果输入

  • 假设我有一个4乘4的网格,所以有16个单元格。每个单元格包含一个介于1,5之间的值。如。 现在我知道我需要使用Dijkstra算法。为了优化这一点,我需要使用优先级队列。 我的目标是找到到达目的地的每个单元格的最短总和。源在网格上可以是随机的,目标也可以是随机的。(即并非总是从左上到右下)。 我曾经研究过使用邻接矩阵的图。但是,使用此网格创建相邻矩阵是否明智?i、 e.将所有非相邻字段设置为无穷大

  • 我正在用Selenium IDE测试一个包含表的网页。我想通过CSS选择器验证表格单元格(行,列)中的文本。表的HTML结构非常简单。下面是一个表的示例,其中每一行表示一个人的不同属性: 在Selenium IDE中,我能够使用以下CSS选择器在包含AGE的表行中找到“49”: 当我将这些方法导出为JUnit代码时,问题就来了。以下JUnit代码块工作: (使用方法1) WebDriver.Fin

  • 单击包含< code>VerticalLayout行等组件的Vaadin 8 中的单元格时,不会选中该行(使用Vaadin 8.1.5)。 如果组件未填充整个单元格,则单击单元格中未使用的区域会使该行处于选中状态。 我一直在研究如何将点击组件转发到单元格点击侦听器,但尚未对此有任何控制。猜猜这甚至不是最好的方法。 解决方案是什么?