Python二维列表中下移数字并合并相同元素的实现方法
问题与解决方案
问题描述
现有一个4×4的二维列表board,元素仅为1或0,需要实现两个功能:
- 将所有1移至列表的最底部行
- 同一列中若有两个相邻的1,合并为2并移至底部
现有代码仅能实现数字下移功能,无法完成合并,期望输出如下:
board = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [1, 0, 1, 2]]
现有代码:
board = [[0, 0, 0, 1], [1, 0, 0, 0], [0, 0, 1, 1], [0, 0, 0, 0]] for col in range(len(board[0])): for row in range(len(board)-1, -1, -1): if board[row][col] != 0: for r in range(row+1, len(board)): if board[r][col] == 0: board[r][col] = board[r-1][col] board[r-1][col] = 0
补充合并逻辑的实现
原代码仅处理了元素下移,缺少合并相邻1的逻辑。我们可以重构代码,先对每一列的1进行合并,再将合并后的元素统一移至列的底部,具体步骤如下:
- 遍历每一列,收集该列所有非零元素(即所有的1)
- 遍历收集到的1,将相邻的两个1合并为2,单个1保留
- 构造新的列:在合并后的元素前补充足够的0,让列的长度保持4,确保非零元素位于底部
- 将新列替换回原列表的对应列
修改后的完整代码:
board = [[0, 0, 0, 1], [1, 0, 0, 0], [0, 0, 1, 1], [0, 0, 0, 0]] # 遍历每一列 for col in range(len(board[0])): # 收集当前列的所有非零元素 column = [board[row][col] for row in range(len(board)) if board[row][col] != 0] merged = [] i = 0 # 合并相邻的1 while i < len(column): # 检查当前元素和下一个元素是否都是1 if i + 1 < len(column) and column[i] == 1 and column[i+1] == 1: merged.append(2) i += 2 # 跳过已合并的下一个元素 else: merged.append(column[i]) i += 1 # 构造新列:前面补0,合并后的元素放在底部 new_column = [0]*(len(board)-len(merged)) + merged # 替换原列 for row in range(len(board)): board[row][col] = new_column[row] # 输出结果 print("board = [") for row in board: print(f" {row},") print(" ]")
运行这段代码后,即可得到期望的输出。这种方式比原代码的逐个下移逻辑更清晰,同时完成了合并和底部对齐的需求。
内容的提问来源于stack exchange,提问作者Turtle
相关产品推荐
相关产品推荐

