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

15x15矩阵横竖单词提取问题:翻转后部分单词未捕获

问题描述

需要从15x15矩阵中提取所有水平和垂直方向的单词,目前水平方向单词可全部提取,但处理垂直方向时仅能提取部分单词(如单个字母I、J、K、L被捕获,但HBA及底部字母E、F、G未被添加)。现有代码及输出如下:

原代码

words = []
def stuff(b):
    for line in b:
        word = ""
        for tile in line:
            if tile != "  ":
                word += tile
            elif tile == "  ":
                if word != "":
                    words.append(word)
                    word = ""

stuff(board)

print_board(board)

t_board = [list(row) for row in zip(*reversed(board))]

print_board(t_board)

stuff(t_board)

print(words)

输出结果

['A', 'B', 'C', 'D', '  ', '  ', 'E', 'F', 'G', '  ', '  ', '  ', '  ', '  ', '  ']
['B', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['H', 'I', 'J', 'K', 'L', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']

['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', 'H', 'B', 'A']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', 'I', '  ', 'B']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', 'J', '  ', 'C']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', 'K', '  ', 'D']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', 'L', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', 'E']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', 'F']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', 'G']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ', '  ']
['ABCD', 'EFG', 'B', 'HIJKL', 'I', 'J', 'K', 'L']

代码漏洞分析

  • 行尾单词遗漏:stuff函数仅在遇到空格时才将累积的单词加入列表,如果一行以有效字符结尾(无空格),这部分单词会被直接丢弃。比如转置后的第一行末尾的HBA,以及最后几行的E、F、G,都是因为这个原因丢失。
  • 转置逻辑冗余:原代码用zip(*reversed(board))生成垂直方向行,其实不需要reversed,直接zip(*board)就能得到原矩阵的列(即垂直方向的行),反转操作完全多余。

修复后的代码

修正stuff函数,在每一行遍历结束后检查是否有未添加的单词,同时修正转置逻辑:

words = []
def stuff(b):
    for line in b:
        word = ""
        for tile in line:
            if tile != "  ":
                word += tile
            else:
                if word != "":
                    words.append(word)
                    word = ""
        # 处理行尾未被触发的单词
        if word != "":
            words.append(word)

# 提取水平方向单词
stuff(board)

# 提取垂直方向单词:直接转置矩阵,无需反转
t_board = [list(row) for row in zip(*board)]
stuff(t_board)

print(words)

更简洁的实现方式

利用字符串拼接和分割简化逻辑,避免手动遍历字符:

def extract_words(matrix):
    words = []
    # 处理水平方向
    for line in matrix:
        # 将行转为字符串,替换双空格为单空格后分割,过滤空内容
        line_str = ''.join(line).replace('  ', ' ')
        words.extend([word for word in line_str.split() if word])
    # 处理垂直方向
    for col in zip(*matrix):
        col_str = ''.join(col).replace('  ', ' ')
        words.extend([word for word in col_str.split() if word])
    return words

# 调用示例
words = extract_words(board)
print(words)

这种方式利用split()自动分割连续非空格字符,同时过滤空字符串,逻辑更简洁,也从根源上避免了行尾单词遗漏的问题。

内容的提问来源于stack exchange,提问作者Aron Fredriksson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:10:28