统计两个列表词频并输出为字典的代码问题求助
现有代码问题
- 计数器位置错误:
count变量定义在循环外层,统计完一个单词后不会重置,后续单词的统计值会累加之前的计数,最终结果完全不符合预期。 - 变量命名违规:使用Python内置类型名
dict作为自定义变量名,会覆盖内置的dict类,后续如果需要调用dict()方法时会触发异常。 - 逻辑存在缺失:checklist中没有在文章列表里出现过的单词,不会被写入最终结果字典,无法完整输出所有checklist单词的统计值。
- 时间效率低下:两层嵌套循环的实现时间复杂度为O(n*m)(n为checklist长度,m为文章单词列表长度),数据量较大时运行速度会非常慢。
修复&优化方案
基础修复版(保留原有实现逻辑)
仅修改原有代码的错误点,逻辑和最初的思路一致:
# 避免用内置名做变量名,改成语义化的命名 check_list = ["a", "b", "c", "d"] article_words = ["a", "v", "c", "a", "d", "c"] result = {} for target_word in check_list: # 每次统计新单词前重置计数器 count = 0 for word in article_words: if target_word == word: count += 1 # 无论是否匹配到都写入结果,保证checklist单词全覆盖 result[target_word] = count print(result)
高效优化版
用Python标准库collections.Counter先一次性统计文章所有单词的出现次数,再遍历checklist生成结果,时间复杂度降到O(n+m),代码更简洁高效:
from collections import Counter check_list = ["a", "b", "c", "d"] article_words = ["a", "v", "c", "a", "d", "c"] # 一次性统计文章所有单词的出现频率 article_word_count = Counter(article_words) # 用字典推导式生成结果,未匹配到的单词默认返回0 result = {word: article_word_count.get(word, 0) for word in check_list} print(result)
两种实现的输出结果一致:{'a': 2, 'b': 0, 'c': 2, 'd': 1}
内容的提问来源于stack exchange,提问作者HUGO LEUNG
相关产品推荐
相关产品推荐

