NxN 数组检查邻居单元格

2024-09-27 07:32:00 发布

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

我有一个NxN数组(t\u字段),单元格中填充了0或1。你知道吗

我想检查范围内实体的任何邻居是否已填充。你知道吗

实体是一个1的序列,具有(row,start),(row,end),我想检查上面的行,下面的行,但是在start-1和end+1的约束范围内:

contacts = [t_field[row_n - 1][start-1:end+2], 
            t_field[row_n + 1][start-1:end+2]]

但是如果我在第0行,我不想让它检查第1行,因为这将查看网格的末尾。在这种情况下,它将只检查行1;反之亦然,如果行是n(网格的大小),它将在检查行+1时执行trow和indexeror

start/end也是一样,如果start是0,我不想勾选-1,因为它会看到网格的另一面。我只想检查end+2。反之亦然。你知道吗

start = column_n - length + 1
end = column_n

upperrow = row_n - 1
lowerrow = row_n + 1

if upperrow < 0:
    upperrow = None
if lowerrow >= len(t_field):
    lowerrow = None

leftside = start - 1
rightside = end + 2
if leftside < 0:
    leftside = None
if rightside >= len(t_field):
    rightside = None

if upperrow is not None and lowerrow is not None:
    if leftside is not None and rightside is not None:
        contacts = [t_field[upperrow][leftside:rightside],
                    t_field[lowerrow][leftside:rightside]]
    elif leftside is None and rightside is not None:
        contacts = [t_field[upperrow][0:rightside],
                    t_field[lowerrow][0:rightside]]
    elif leftside is not None and rightside is None:
        contacts = [t_field[upperrow][leftside:end + 1],
                    t_field[lowerrow][leftside:end + 1]]
elif upperrow is None and lowerrow is not None:
    if leftside is not None and rightside is not None:
        contacts = [t_field[lowerrow][leftside:rightside]]
    elif leftside is None and rightside is not None:
        contacts = [t_field[lowerrow][0:rightside]]
    elif leftside is not None and rightside is None:
        contacts = [t_field[lowerrow][leftside:end + 1]]
elif upperrow is not None and lowerrow is None:
    if leftside is not None and rightside is not None:
        contacts = [t_field[upperrow][leftside:rightside]]
    elif leftside is None and rightside is not None:
        contacts = [t_field[upperrow][0:rightside]]
    elif leftside is not None and rightside is None:
        contacts = [t_field[upperrow][leftside:end + 1]]

if any(itertools.chain(*contacts)):
   return True

这个很好用,但它非常难看。非常重复的代码,很难阅读/理解正在发生的事情。你知道吗

如你所见,有3行是我想要的,至少30行是我必须写的,才能让这3行工作。你知道吗

Grid

在这张图片中,我展示了我在寻找什么。实体是灰色区域,邻居是红色区域。我想看看邻居有没有人。你知道吗

怎样才能找到那些邻居?


Tags: andnonefieldifisnotstartend
1条回答
网友
1楼 · 发布于 2024-09-27 07:32:00

假设将代码放入函数中:

 leftside = max(0, start -1)
 rightside = min(end + 1, len(t_field) - 1)

 if row >= 1:
     if any(t_field[row -1][leftside:rightside]): return True
 if row < len(t_field) - 1:
     if any(t_field[row + 1][leftside:rightside]): return True
 return False

相关问题 更多 >

    热门问题