LeetCode 54.螺旋矩阵Python代码报错:IndexError: pop from empty list
问题分析与解决
空列表来源
你的代码报错是因为循环过程中未判断矩阵是否为空就执行pop(-1)操作。以测试用例[[1,2,3],[4,5,6],[7,8,9]]为例,第二次循环时:
- 第一步
matrix.pop(0)取出最后一行[5],此时matrix变为空列表[] - 后续直接执行
matrix.pop(-1),尝试从空列表中弹出元素,触发IndexError
另外代码还有隐藏问题:用answer.append(matrix.pop(0))会把整个行列表加入结果,最终得到嵌套列表,不符合题目要求的扁平输出格式。
解决办法
需要在每一步操作前检查矩阵/行是否非空,同时将append改为extend来扁平化结果:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]: answer = [] while matrix: # 取出顶部行 answer.extend(matrix.pop(0)) # 取出右侧列(每行最后一个元素) if matrix and matrix[0]: # 矩阵非空且第一行非空 for row in matrix: answer.append(row.pop()) # 取出底部行(反转后加入,保证螺旋顺序) if matrix: answer.extend(matrix.pop()[::-1]) # 取出左侧列(倒序遍历每行取第一个元素) if matrix and matrix[0]: for row in reversed(matrix): answer.append(row.pop(0)) return answer
关键修改点:
- 用
extend替代append添加整行元素,保证结果是扁平列表 - 每次执行
pop操作前先判断matrix是否非空;操作列元素时,额外判断行是否非空,避免从空行弹出 - 取出底部行时反转,确保符合螺旋从右到左的遍历顺序
测试用例验证
对于[[1,2,3],[4,5,6],[7,8,9]],执行流程:
- 取出顶部行
[1,2,3],结果:[1,2,3],矩阵变为[[4,5,6],[7,8,9]] - 取出右侧列
6,9,结果:[1,2,3,6,9],矩阵变为[[4,5],[7,8]] - 取出底部行并反转
[8,7],结果:[1,2,3,6,9,8,7],矩阵变为[[4,5]] - 取出左侧列
4,结果:[1,2,3,6,9,8,7,4],矩阵变为[[5]] - 下一轮循环取出顶部行
[5],结果:[1,2,3,6,9,8,7,4,5],矩阵为空,循环结束
最终输出符合题目要求的螺旋顺序。
内容的提问来源于stack exchange,提问作者childoflogos
相关产品推荐
相关产品推荐

