Codewars 4级题《文本中最常用单词》Python实现随机测试失败求助
问题排查与修复方案
你的代码存在几处核心逻辑错误,导致无法通过随机测试用例,具体问题和修复方案如下:
1. 非目标字符处理逻辑错误
题目要求非字母、非单引号的字符视为空白,但你的代码直接过滤了这些字符,没有替换为空格。这会导致原本分隔的单词被错误拼接:
- 输入
"don't, stop!"会被处理成"don'tstop",两个单词被合并成一个 - 输入
"hello\nworld"会被处理成"helloworld",换行符被过滤后单词直接相连
2. 单词分割方式不合理
使用split(' ')只能按单个空格分割,当处理后文本存在连续空格时,会产生空字符串元素;同时该方式无法识别换行、制表符等其他空白字符,导致分割不彻底。
修复后的代码
方案一:使用正则(简洁高效)
import re from collections import Counter def top_3_words(text): # 匹配符合要求的单词:包含字母和可选单引号,且至少有一个字母 words = re.findall(r"(?<!\S)[a-z']*(?=[a-z])[a-z']*(?!\S)", text.lower()) # 过滤全单引号的无效单词,统计次数 word_count = Counter(word for word in words if word.replace("'", "").isalpha()) # 取出现次数前三的单词 return [word for word, _ in word_count.most_common(3)]
方案二:基础字符处理(易理解)
from collections import Counter def top_3_words(text): # 将非字母/单引号的字符替换为空格,统一转小写 processed_chars = [] for char in text.lower(): if char.isalpha() or char == "'": processed_chars.append(char) else: processed_chars.append(' ') processed_text = ''.join(processed_chars) # 分割单词,过滤空字符串和全单引号的无效单词 valid_words = [word for word in processed_text.split() if word.replace("'", "").isalpha()] # 统计并返回前三高频单词 word_count = Counter(valid_words) return [word for word, _ in word_count.most_common(3)]
关键修复说明
- 把所有非字母/单引号的字符替换为空格,确保单词分隔正确
- 使用
split()(无参数)分割,自动处理任意空白字符(多空格、换行、制表符等) - 用
Counter简化次数统计,most_common(3)直接获取前3高频单词 - 保留了对全单引号这类无效单词的过滤逻辑,符合题目规则
内容的提问来源于stack exchange,提问作者lucastheiss
相关产品推荐
相关产品推荐

