Python统计邮件发送频次时生成空字典的问题排查
问题分析与解决
你的代码得到空字典的核心问题是:只计算了频次增量,但没把结果存回字典。
具体问题点
frequency.get(line[1], 0) + 1 这行确实能算出当前邮箱的频次加1,但这个结果只是临时值,没有赋值给字典对应的键——get方法只会返回值,不会修改原字典,所以frequency始终是空的。
修正后的代码
两种常用的修正方式:
方式一:直接赋值更新字典
if len(fname) < 1: fname = "mbox-short.txt" fhand = open(fname) frequency = dict() for line in fhand: if line.startswith("From "): line = line.split() email = line[1] # 把计算后的频次存回字典对应键的位置 frequency[email] = frequency.get(email, 0) + 1 print(frequency)
方式二:用defaultdict简化计数
如果想用更简洁的写法,可以用Python内置的defaultdict自动处理默认值:
from collections import defaultdict if len(fname) < 1: fname = "mbox-short.txt" fhand = open(fname) frequency = defaultdict(int) for line in fhand: if line.startswith("From "): line = line.split() # 不存在的键会自动设为0,直接自增即可 frequency[line[1]] += 1 print(dict(frequency)) # 转成普通字典输出
额外优化建议
- 用
with语句管理文件,自动关闭文件避免资源泄漏:
if len(fname) < 1: fname = "mbox-short.txt" frequency = dict() with open(fname) as fhand: for line in fhand: if line.startswith("From "): email = line.split()[1] frequency[email] = frequency.get(email, 0) + 1 print(frequency)
- 要是还需要找出发送量最多的邮箱,统计完后遍历字典即可:
max_count = 0 max_email = "" for email, count in frequency.items(): if count > max_count: max_count = count max_email = email print(f"发送量最多的邮箱是 {max_email},共发送 {max_count} 次")
内容的提问来源于stack exchange,提问作者Alexander Wilson
相关产品推荐
相关产品推荐

