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

Python去除标点并生成词频字典:函数实现问题求助

解决你的Python单词频率统计问题

我看了你的代码,确实有几个地方需要调整,咱们一步步来捋清楚:

你的代码存在的核心问题

  • 标点处理无效:你最后那个循环里的"".join([ c if not c.isalpha() else "" for c in result])完全没起作用——首先你遍历的是result的键,但这个join操作的结果没有赋值给任何变量,而且判断逻辑搞反了(应该是保留字母,去掉非字母,你写反了)。
  • 单词分割有漏洞:用split(' ')只会按单个空格分割,如果字符串里有多个连续空格、制表符或者换行,会产生空字符串,这些空字符串也会被统计进去,导致结果出错。
  • 统计顺序错误:你先把带标点的单词统计了,再想着清理标点,这时候已经把hello!和hello当成两个不同的单词了,统计结果自然不对。

修正后的代码

import string

def word_dic(input_string):
    # 1. 转换为小写
    lower_str = input_string.lower()
    
    # 2. 去除所有标点符号:把标点替换为空字符串
    cleaned_str = lower_str.translate(str.maketrans('', '', string.punctuation))
    
    # 3. 分割单词:用split()自动处理任意空白符,避免空字符串
    words = cleaned_str.split()
    
    # 4. 统计单词频率
    result = {}
    for word in words:
        if word in result:
            result[word] += 1
        else:
            result[word] = 1
    # 或者用collections.defaultdict会更简洁:
    # from collections import defaultdict
    # result = defaultdict(int)
    # for word in words:
    #     result[word] += 1
    
    return result

代码解释

  • 标点处理:我用了string.punctuation(它包含了所有常见的标点符号),配合str.maketrans创建翻译表,直接把所有标点替换为空,比手动判断每个字符高效得多。
  • 单词分割:split()不带参数时,会自动把任意连续的空白字符(空格、制表符、换行等)作为分隔符,而且不会产生空字符串。
  • 统计逻辑:先清理好单词,再进行统计,这样带标点和不带标点的同一个单词会被归为一类。

举个测试例子:

test_str = "Hello! Hello world. World world, hello?"
print(word_dic(test_str))
# 输出:{'hello': 3, 'world': 3}

这样就完全符合你的需求啦!

内容的提问来源于stack exchange,提问作者Miguel 2488

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:28:54