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
相关产品推荐
相关产品推荐

