如何在列表构成的网格中查找指定整数的八向相邻元素并计算邻域均值
实现方案
核心逻辑说明
我们可以分三步实现需求:先定位所有值为1的元素坐标,再对每个坐标用列表推导式提取8邻接的合法元素求平均值,最后批量替换即可,逻辑可适配任意尺寸的矩形网格。
完整可运行代码
# 示例网格 grid = [ [1, 5000, 10000], [2500, 255, 230], [12500, 4250, 1] ] rows = len(grid) # 空网格直接跳过后续逻辑 if rows == 0: exit() cols = len(grid[0]) # 第一步:提前定位所有值为1的坐标,避免边修改网格边查找出现错误 ones_positions = [(i, j) for i, row in enumerate(grid) for j, val in enumerate(row) if val == 1] for i, j in ones_positions: # 第二步:列表推导式获取所有合法的8邻接元素(排除自身、超出网格边界的坐标) neighbours = [ grid[i + di][j + dj] for di in (-1, 0, 1) for dj in (-1, 0, 1) if not (di == 0 and dj == 0) and 0 <= i + di < rows and 0 <= j + dj < cols ] # 计算平均值,兼容网格只有1个元素的边界情况(避免除零错误) neighbour_average = sum(neighbours) / len(neighbours) if neighbours else 0 # 第三步:替换值 grid[i][j] = neighbour_average # 输出修改后的网格验证结果 print(grid)
结果验证
针对示例网格的运行结果如下:
- 左上角的1的邻接元素为
[5000, 2500, 255],平均值为2585 - 右下角的1的邻接元素为
[230, 255, 4250],平均值约为1578.33
最终输出网格为:[[2585.0, 5000, 10000], [2500, 255, 230], [12500, 4250, 1578.3333333333333]]
适配说明
- 如果要处理不规则网格(每行长度不同),只需要将列合法性判断改为
0 <= j + dj < len(grid[i + di])即可 - 如果需要保留原始网格,可先通过
copy.deepcopy()拷贝一份网格再做修改
内容的提问来源于stack exchange,提问作者Anonymous_Noob162
相关产品推荐
相关产品推荐

