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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:25:22