求助:Python文本词频统计程序出现TypeError及功能实现问题
问题解析与代码修正
错误原因
你碰到的TypeError: list indices must be integers or slices, not list是因为:
- 你把本该用来存单词频率的
dict1定义成了列表([]),但列表只能用整数或者切片当索引,你却用分割行得到的列表x去访问它,这完全不符合列表的使用规则。 - 统计单词频率得用字典(键值对结构),字典可以用单词当键,对应存它的出现次数,而不是列表。
除此之外,你的代码还有两个逻辑漏洞:
- 用
split(' ')分割文本会留下换行产生的空字符串,应该用无参数的split(),它能自动处理所有空白字符(空格、换行、制表符等)。 - 你直接拿整行分割后的列表
x去判断是否在dict1里,这不对,得遍历x里的每个单词,逐个统计频率。
修正后的完整代码
# 提示输入文件名 fname = input("请输入文本文件名:") # 初始化字典存单词频率,用with自动管理文件 word_counts = {} with open(fname, 'r') as file: for line in file: # 转小写后分割单词,自动处理空白 words = line.lower().split() for word in words: # 更新单词频率 if word in word_counts: word_counts[word] += 1 else: word_counts[word] = 1 # 找频率最高的单词 max_freq = max(word_counts.values()) max_word = next(word for word, count in word_counts.items() if count == max_freq) # 找频率最低的单词 min_freq = min(word_counts.values()) min_word = next(word for word, count in word_counts.items() if count == min_freq) # 输出结果 print(f"Max frequency: {max_word} {max_freq}") print(f"Min frequency: {min_word} {min_freq}")
代码说明
- 文件管理:
with语句会在代码块结束后自动关闭文件,避免资源浪费。 - 大小写统一:
line.lower()把所有单词转成小写,确保"I"和"i"、"Do"和"do"被算作同一个单词。 - 单词分割:无参数的
split()会把任意数量的空白(包括换行)作为分隔符,不会产生空字符串。 - 极值查找:用
next()直接取第一个符合条件的单词,和你给出的预期结果一致。
测试结果
用你提供的测试文本运行,输出和预期完全一致:
Max frequency: i 5 Min frequency: you 1
内容的提问来源于stack exchange,提问作者joshki.03
相关产品推荐
相关产品推荐

