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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:22:20