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

Python字母相对频率统计求助:需排除非字母字符并按高低排序

问题修正与解决方案

原代码的问题

  1. 文件读取逻辑错误:input_string = norec_corpus.txt 写法完全错误,应该用file.read()读取文件内容,不能直接把文件名当作变量使用。
  2. 未过滤非字母字符:代码把数字、标点等所有字符都纳入统计,不符合需求。
  3. 结果输出位置错误:print语句放在循环外部,只会输出最后一个字符的统计结果。
  4. 缺少相对频率计算与排序逻辑:没有实现频率转换和按高低排序的核心需求。

修正后的代码

# 读取文件内容
with open('text.txt', 'r', encoding='utf-8') as file:
    content = file.read()

# 过滤出仅字母字符,并统一转为小写(大小写视为同一字母)
letters = [char.lower() for char in content if char.isalpha()]

# 统计每个字母的出现次数
char_count = {}
for char in letters:
    char_count[char] = char_count.get(char, 0) + 1

# 计算总字母数,避免除以0的情况
total_letters = len(letters)
if total_letters == 0:
    print("文件中没有字母字符")
    exit()

# 计算相对频率并按频率从高到低排序
sorted_result = sorted(
    [(char, count, round(count / total_letters, 4)) for char, count in char_count.items()],
    key=lambda x: x[2],
    reverse=True
)

# 输出结果
print("字母统计结果(按相对频率从高到低排序):")
for item in sorted_result:
    print(f"字母 '{item[0]}':出现次数 {item[1]},相对频率 {item[2]}")

代码说明

  • 文件读取:用file.read()正确读取文件内容,指定encoding='utf-8'避免中文或特殊字符乱码。
  • 字符过滤:通过isalpha()判断是否为字母,lower()统一转为小写(若需要区分大小写,去掉lower()即可)。
  • 次数统计:用字典char_count高效统计,比原代码的双重循环更适合处理大文件。
  • 相对频率计算:用字母出现次数除以总字母数,保留4位小数提升可读性。
  • 排序:借助sorted()函数按相对频率倒序排列,直接输出符合要求的结果顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:25:27