不规则二维数组边界处理需逐行校验列长:遍历时对每行先获取真实长度cols=len(row),再检查0≤j

不规则二维数组(比如每行长度不同)的边界处理比标准矩形数组更棘手,因为不能简单用统一的 m 或 n 做全局判断。关键在于:每一行都要单独确认列索引是否合法,且访问邻居时必须逐个检查行列有效性。
先确认每行真实长度
Python 中常见不规则结构是列表套列表:grid = [[1,2], [3,4,5], [6]]。直接用 len(grid[0]) 当作列数会出错。
- 遍历时,对每一行
row,先算cols = len(row) - 访问
row[j]前,必须确保0 - 不要预设所有行等长,避免硬编码
grid[i][j]而不校验
访问邻居时逐个判断坐标
比如要统计某位置周围非零元素个数,不能直接写 grid[i-1][j] 等八个表达式——其中任意一个越界都会报 IndexError。
- 把八个偏移量写成列表:
dirs = [(-1,-1), (-1,0), (-1,1), (0,-1), (0,1), (1,-1), (1,0), (1,1)] - 对每个
(dx, dy),计算新坐标ni, nj = i + dx, j + dy - 然后分别检查:
0 且 <code>0 - 两条件都满足才安全访问
grid[ni][nj]
用切片代替单点索引(更简洁安全)
切片天然容错:即使起始或结束超出范围,也不会报错,而是返回空列表或截断结果。
- 想取第
i行从j-1到j+2的子段?写grid[i][j-1:j+2]即可 - 想取上一行中间三列?
grid[i-1][max(0,j-1):min(len(grid[i-1]), j+2)] - 适合批量读取、填充默认值场景,省去大量 if 判断
封装安全访问函数(推荐复用)
把校验逻辑收进一个函数,后续调用清晰又不易漏判:
def safe_get(grid, i, j, default=None):if 0 return grid[i][j]
return default
- 调用时直接写
safe_get(grid, i-1, j),不用每次重复写条件 - 可按需扩展支持默认值、日志、计数等附加行为
- 团队协作时语义明确,降低理解成本











