如何用Python实现单词搜索并返回单词的起止坐标?
单词搜索程序:水平匹配实现问题
要做一个单词搜索程序,从字符串列表words中提取单词,在二维numpy网格labels中找到单词后,返回其起始行、起始列、结束行、结束列。目前先实现水平匹配,但卡在起始字符匹配后,不知道如何检查后续字符是否和网格同一行的下一列字符匹配。
现有代码:
def horizontal(labels, words): puzzle_word = [] rows = labels.shape[0] # 15 cols = labels.shape[1] # 15 length = len(words) word = 0 # initialize word where word will be extracted from words # replacing all the whitespaces: for line in labels: line = line.replace(' ', '') line = line.strip() if len(line) = 0: for line in labels: line = line.replace('\n', '') line = line.lower() words.append(line) words = [x.upper() for x in words] words = sorted(words) # iterate through the entire words list & extracting the words 1 by 1 while word < length: for row in range(rows): for column in range(columns): character = labels[row][col] # if the starting character matches with a word in the 2-D grid/array puzzle (called labels) # and width of all the columns of the grid - the character column to make sure the word will fit and not go over the column size if word[0] == character and len(word) <= (cols-col): # how can I implement then look for the next character of the word and see if it matches the next character in the grid on the next column since we are finding horizontally now.
参考思路示例:
for index in word: while index < len(word): index += 1 ......................
使用的二维numpy网格示例:
J H C A T E H U C Y M J A L Q # cat is here N Q Q H K C B V T E X U F A E W O T A X E J K G N B P V M D C H C O U I R D P O F X X Z B Q M F R C P L P B H X K S L S H L I E A R F C Q V O H M D D K V F V P E A S Y Q P Z O J L H K Z N L T V G P C N G H D L R R Z V B S H D S M X Y T L B N A E L E P H A N T I S D N A # elephant is here O Y F D O G W E I L P X J R Z # dog is here Y D F C R W O S A U Z Y O T W K H M E E A L N C C G X L F B L Z F F S K Q I E L A R S S B X Z O H P D M J W Y C V D P A words: ['cat', 'dog', 'elephant']
解决方案:水平匹配实现
先指出原代码的核心问题:
- 预处理逻辑混乱,错误修改了传入的
words列表 - 变量名混淆:
word是遍历索引却被当作字符串使用 - 变量拼写错误:
columns未定义,应使用cols
修正后的完整实现代码:
import numpy as np def horizontal(labels, words): # 统一转为大写,避免大小写不匹配 words = [word.upper() for word in words] rows = labels.shape[0] cols = labels.shape[1] results = [] # 存储结果:(单词, 起始行, 起始列, 结束行, 结束列) for target_word in words: word_len = len(target_word) if word_len == 0: continue # 遍历网格每一行 for row in range(rows): # 起始列最多到cols - word_len,防止单词超出网格 for col in range(cols - word_len + 1): # 检查起始字符匹配 if labels[row][col].upper() == target_word[0]: match = True # 遍历单词后续字符,逐一对比网格对应位置 for char_idx in range(1, word_len): grid_char = labels[row][col + char_idx].upper() if grid_char != target_word[char_idx]: match = False break # 完全匹配则记录位置 if match: start_row = row start_col = col end_row = row # 水平匹配行不变 end_col = col + word_len - 1 results.append((target_word, start_row, start_col, end_row, end_col)) return results # 测试示例 labels = np.array([ ['J','H','C','A','T','E','H','U','C','Y','M','J','A','L','Q'], ['N','Q','Q','H','K','C','B','V','T','E','X','U','F','A','E'], ['W','O','T','A','X','E','J','K','G','N','B','P','V','M','D'], ['C','H','C','O','U','I','R','D','P','O','F','X','X','Z','B'], ['Q','M','F','R','C','P','L','P','B','H','X','K','S','L','S'], ['H','L','I','E','A','R','F','C','Q','V','O','H','M','D','D'], ['K','V','F','V','P','E','A','S','Y','Q','P','Z','O','J','L'], ['H','K','Z','N','L','T','V','G','P','C','N','G','H','D','L'], ['R','R','Z','V','B','S','H','D','S','M','X','Y','T','L','B'], ['N','A','E','L','E','P','H','A','N','T','I','S','D','N','A'], ['O','Y','F','D','O','G','W','E','I','L','P','X','J','R','Z'], ['Y','D','F','C','R','W','O','S','A','U','Z','Y','O','T','W'], ['K','H','M','E','E','A','L','N','C','C','G','X','L','F','B'], ['L','Z','F','F','S','K','Q','I','E','L','A','R','S','S','B'], ['X','Z','O','H','P','D','M','J','W','Y','C','V','D','P','A'] ]) words = ['cat', 'dog', 'elephant'] print(horizontal(labels, words))
核心逻辑说明:
- 统一大小写:将目标单词和网格字符都转为大写,避免大小写差异导致匹配失败
- 边界控制:计算起始列的最大范围,确保单词不会超出网格右侧边界
- 逐字符验证:起始字符匹配后,遍历单词的每个后续字符,对比网格同一行、对应列偏移的位置
- 结果记录:完全匹配时,记录起止位置(水平匹配结束行与起始行相同)
内容的提问来源于stack exchange,提问作者Loren Beer
相关产品推荐
相关产品推荐

