如何修复Python单词计数代码以避免重复统计同一单词?
修复单词统计中的大小写与标点问题
你编写的Python代码用于读取文件中的诗歌并统计单词出现次数,但目前存在两个问题:一是大小写不同的同一单词(如Hi和hi)会被分别统计;二是单词附带的标点(如Hi,里的逗号)也会导致同一单词被误判为不同条目。
原代码
def unique_word_count(file): words = open(file, "r") lines = words.read() words = lines.split() counts = dict() for word in words: if word in counts: counts[word] += 1 else: counts[word] = 1 return counts
问题示例
输入字符串:"Hi, hi, hi how are you"
当前代码输出:
{"Hi":1, "hi":1, "hi":1, "how":1, "are":1, "you":1}
期望输出:
{"hi":3, "how":1, "are":1, "you":1}
修复方案
需要从统一大小写和清理标点两个方面入手,同时优化文件操作的安全性:
- 统一单词大小写:将所有单词转换为小写(或大写),消除大小写差异带来的重复统计,使用
str.lower()方法。 - 清理标点符号:移除单词首尾的标点,避免标点导致的误判,借助
string.punctuation和str.strip()实现。 - 优化文件操作:使用
with语句自动管理文件资源,防止文件未关闭的问题。
修复后的完整代码
import string def unique_word_count(file): counts = dict() # 使用with语句自动关闭文件 with open(file, "r") as f: lines = f.read() words = lines.split() for word in words: # 清理首尾标点并转为小写 cleaned_word = word.strip(string.punctuation).lower() # 跳过清理后为空的字符串(比如纯标点的情况) if cleaned_word: # 简化计数逻辑,无需if-else判断 counts[cleaned_word] = counts.get(cleaned_word, 0) + 1 return counts
修复说明
word.strip(string.punctuation)会移除单词首尾的所有常见标点(逗号、句号、感叹号、问号等),确保hi,和hi被识别为同一个单词。.lower()将所有单词转为小写,让Hi、HI、hi统一为hi进行统计。counts.get(cleaned_word, 0) + 1是更简洁的计数方式:如果单词不在字典中,默认返回0,加1后存入;如果已存在,则取当前值加1。with语句会在代码块结束后自动关闭文件,避免资源泄漏。
测试输入"Hi, hi, hi how are you",修复后的代码将输出符合期望的结果:{"hi": 3, "how": 1, "are": 1, "you": 1}
内容的提问来源于stack exchange,提问作者flory
相关产品推荐
相关产品推荐

