Python字母相对频率统计求助:需排除非字母字符并按高低排序
问题修正与解决方案
原代码的问题
- 文件读取逻辑错误:
input_string = norec_corpus.txt写法完全错误,应该用file.read()读取文件内容,不能直接把文件名当作变量使用。 - 未过滤非字母字符:代码把数字、标点等所有字符都纳入统计,不符合需求。
- 结果输出位置错误:
print语句放在循环外部,只会输出最后一个字符的统计结果。 - 缺少相对频率计算与排序逻辑:没有实现频率转换和按高低排序的核心需求。
修正后的代码
# 读取文件内容 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
相关产品推荐
相关产品推荐

