You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python二维列表中下移数字并合并相同元素的实现方法

问题与解决方案

问题描述

现有一个4×4的二维列表board,元素仅为1或0,需要实现两个功能:

  1. 将所有1移至列表的最底部行
  2. 同一列中若有两个相邻的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)
  2. 遍历收集到的1,将相邻的两个1合并为2,单个1保留
  3. 构造新的列:在合并后的元素前补充足够的0,让列的长度保持4,确保非零元素位于底部
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:05:15