Codewars 4 kyu“文本中最常用的单词”与Python

问题描述 投票:0回答:1

编写一个函数,给定一个文本字符串(可能带有标点符号和换行符),返回出现次数最多的前 3 个单词的数组,按出现次数降序排列。

假设: 单词是一串字母(A 到 Z),可选地包含一个或多个 ASCII 中的撇号 (')。 撇号可以出现在单词的开头、中间或结尾('abc, abc', 'abc', ab'c 均有效) 任何其他字符(例如 #、、/、...)都不是单词的一部分,应被视为空格。 匹配应不区分大小写,并且结果中的单词应小写。 关系可能会被任意打破。 如果文本包含的唯一单词少于三个,则应返回前 2 个或前 1 个单词,如果文本不包含单词,则应返回空数组。

def top_3_words(text):
    res = {}
    textf = ''.join([char.lower() for char in text if char.isalpha() or char == ' ' or char == "'"]).split(' ') # Create list with the allowed chars in lower case, join it and split it
    for char in textf:
        if char.replace("'", '').isalpha():
            if char in res:
                res[char] += 1
            else:
                res[char] = 1
    return [i for i, j in sorted(res.items(), key=lambda res: res[1], reverse=True)][:3]

该程序通过了固定的代码战争测试,据我所知代码是正确的,但是,只有少数随机测试返回正确,并且我认为我看不到正在应用的随机测试。有人明白为什么这不起作用吗?或者是代码战争的问题?

python arrays string dictionary
1个回答
0
投票

您应该用空格替换不属于单词的字符,而不是删除它们。否则,您可以将由特殊字符分隔的两个单词连接成一个单词。

textf = ''.join(char.lower() if char.isalpha() or char == ' ' or char == "'" 
                   else ' ' for char in text).split(' ')

请注意,无需创建列表来传递给

join
;可以使用生成器表达式来代替。

© www.soinside.com 2019 - 2024. All rights reserved.