Python中列表的蛇形遍历通用实现方法问询
通用蛇形遍历二维列表的实现方案
我来给你分享一个通用、易扩展的蛇形遍历实现思路,完美适配子列表数量增减、子列表长度变化(甚至不规则二维列表)的场景,逻辑清晰且不需要硬编码特定结构的判断。
核心思路
这种蛇形遍历本质是螺旋式的外围分层遍历,我们可以通过「方向切换+访问标记」的方式来实现:
- 定义四个遍历方向:右、下、左、上,按顺序循环切换
- 从矩阵的左上角开始遍历,每访问一个元素就标记它
- 每次计算下一个位置,如果位置不合法(超出矩阵范围、元素不存在、已被访问),就切换方向,重新计算下一个合法位置
- 直到所有元素都被访问完为止
代码实现(Python)
def snake_traverse(matrix): if not matrix: return [] result = [] visited = set() total_elements = sum(len(row) for row in matrix) rows_count = len(matrix) # 定义遍历方向:右、下、左、上 directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] current_dir = 0 # 初始方向为右 current_row, current_col = 0, 0 while len(result) < total_elements: # 加入当前元素并标记已访问 result.append(matrix[current_row][current_col]) visited.add((current_row, current_col)) # 计算下一个位置 next_row = current_row + directions[current_dir][0] next_col = current_col + directions[current_dir][1] # 检查下一个位置是否合法:行在范围内、列在当前行的范围内、未被访问 is_valid = False if 0 <= next_row < rows_count: if 0 <= next_col < len(matrix[next_row]) and (next_row, next_col) not in visited: is_valid = True # 如果不合法,切换方向重新计算下一个位置 if not is_valid: current_dir = (current_dir + 1) % 4 next_row = current_row + directions[current_dir][0] next_col = current_col + directions[current_dir][1] # 更新当前位置 current_row, current_col = next_row, next_col return result
测试你的示例
用你提到的输入矩阵测试:
matrix = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12] ] print(snake_traverse(matrix)) # 输出:[1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7]
完全符合你的期望输出。
为什么这个方案通用且可扩展?
- 适配任意行数/列数:不管是2行、5行还是更多,只要矩阵非空就能处理,不需要修改代码
- 支持不规则子列表:即使有的子列表长、有的短(比如
[[1,2], [3], [4,5,6]]),代码会自动判断位置合法性,不会出现索引越界 - 易扩展方向:如果需要改变遍历起始点或者方向顺序(比如从右下角开始、或者初始方向改为下),只需要调整
directions数组的顺序或者初始的current_row/current_col即可 - 逻辑清晰:用循环+方向控制替代硬编码的索引判断,后期维护和修改都很方便
内容的提问来源于stack exchange,提问作者JD2775
相关产品推荐
相关产品推荐

