Checkio任务求助:统计指定单词在文本中的出现次数并生成字典
解决Checkio
popular_words 任务的思路与代码 嘿,我来帮你搞定这个Checkio的任务!看起来你已经走了大半路,咱们把剩下的步骤理清楚就行。
首先,先明确任务的核心要求:
- 忽略大小写(比如文本里的
I要和目标列表里的i匹配) - 统计目标单词的出现次数,没出现的单词要返回0
- 最终输出是键为目标单词、值为次数的字典
基础实现思路(一步步来)
我们可以拆解成这几步:
- 统一大小写:把整个文本和目标单词都转成小写,避免大小写敏感的问题。
- 拆分文本为单词列表:把处理后的文本拆成单个单词。
- 初始化结果字典:给每个目标单词设置初始计数0,确保没出现的单词不会遗漏。
- 遍历计数:逐个检查拆分后的单词,只要在目标列表里就增加对应计数。
代码实现如下:
def popular_words(text, words): # 把文本转为小写,并按空白字符拆分成单词列表 lower_text_words = text.lower().split() # 初始化结果字典,所有目标单词计数默认0 count_dict = {word: 0 for word in words} # 遍历每个单词,更新计数 for word in lower_text_words: if word in count_dict: count_dict[word] += 1 return count_dict
测试一下你的示例:
print(popular_words(''' When I was One I had just begun When I was Two I was nearly new ''', ['i', 'was', 'three', 'near'])) # 输出: {'i': 4, 'was': 3, 'three': 0, 'near': 0}
完全符合要求!
更简洁的实现(用collections.Counter)
如果想让代码更简洁,可以用Python内置的Counter类来自动统计单词次数,然后再补全目标单词的0值:
from collections import Counter def popular_words(text, words): # 统计所有小写单词的出现次数 word_counter = Counter(text.lower().split()) # 用字典推导式生成结果,不存在的单词返回0 return {word: word_counter.get(word, 0) for word in words}
这个写法更高效,Counter会帮我们完成大部分统计工作,get方法可以直接指定默认值0,非常方便。
额外注意:处理带标点的文本
如果任务中的文本可能包含标点(比如Hello, world!),直接split()会得到['hello,', 'world!'],这时候目标单词hello就匹配不上了。这时候可以用正则表达式来提取纯单词:
import re from collections import Counter def popular_words(text, words): # 提取所有字母/撇号组成的单词(支持don't这类形式),转小写 clean_words = re.findall(r"\b[\w']+\b", text.lower()) word_counter = Counter(clean_words) return {word: word_counter.get(word, 0) for word in words}
这个版本能处理更复杂的文本场景,不过要看Checkio的具体测试用例是否需要。
内容的提问来源于stack exchange,提问作者Desiigner
相关产品推荐
相关产品推荐

