Python网格单词匹配函数sleuth运行返回None问题排查
代码存在的两个核心问题
1. 语法层面:return语句缩进错误
你给出的sleuth函数中,最后一行return l的缩进多了1个空格,和外层for循环的缩进层级不匹配。如果你的运行环境没有抛出缩进错误反而返回None,大概率是实际代码中return被错误缩进在了for循环内部,循环第一次判断结束就提前返回了空值。
2. 逻辑层面:子串匹配逻辑错误
你当前封装的diagsUpRight/diagsDownRight/rows/cols四个函数,返回的都是整行、整列、整对角线拼接后的完整长字符串列表,比如第一行拼接结果是rawbit,你要匹配的目标单词raw是这个长字符串的子串,而不是列表中的独立元素。你直接用if word in rows(grid)判断的是word是否是列表的元素,自然匹配不到结果。
修复后的代码
首先调整匹配逻辑,把判断单词是否在列表中,改成判断单词是否是任意长串的子串,同时修正缩进:
def diagsDownRight(M): n = len(M) m = [[''] * (n - i - 1) + row + [''] * i for i, row in enumerate(M)] return [''.join(col) for col in zip(*m)]+[''.join(col[::-1]) for col in zip(*m)] def diagsUpRight(M): n = len(M) m = [['']*i + row + ['']*(n-i-1) for i, row in enumerate(M)] return [''.join(col) for col in zip(*m)]+[''.join(col[::-1]) for col in zip(*m)] def rows(M): return ["".join(row) for row in M]+["".join(reversed(row)) for row in M] def cols(M): return ["".join(col) for col in zip(*M)]+ [''.join(col[::-1]) for col in zip(*M)] def sleuth(grid: list[list[str]], words: list): l = [] # 提前把所有方向的长串都取出,避免重复计算 all_lines = diagsUpRight(grid) + diagsDownRight(grid) + rows(grid) + cols(grid) for word in words: # 只要单词是任意长串的子串就加入结果 if any(word in line for line in all_lines): l.append(word) return l
你给出的测试用例grid定义缺了外层左中括号,修正后测试代码:
grid = [ ["r","a","w","b","i","t"], ["x","a","y","z","c","h"], ["p","a","b","e","i","e"], ["t","r","s","b","o","g"], ["u","t","x","v","i","t"], ["n","m","r","w","o","t"]] words = ["bog", "moon", "rabbit", "the", "bit", "raw"] print(sleuth(grid, words))
运行输出:['bog', 'rabbit', 'the', 'bit', 'raw'],和预期结果一致,顺序差异可以根据需要调整排序逻辑。
内容的提问来源于stack exchange,提问作者Bruffff
相关产品推荐
相关产品推荐

