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

如何修复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}

修复方案

需要从统一大小写和清理标点两个方面入手,同时优化文件操作的安全性:

  1. 统一单词大小写:将所有单词转换为小写(或大写),消除大小写差异带来的重复统计,使用str.lower()方法。
  2. 清理标点符号:移除单词首尾的标点,避免标点导致的误判,借助string.punctuation和str.strip()实现。
  3. 优化文件操作:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:15:34