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

使用字典统计邮箱出现次数结果偏高的原因及修复方法

邮箱计数异常的原因与修复方案

问题背景

需要统计mbox-short.txt文件中以From 开头行里的邮箱出现次数,但运行代码后统计结果远高于实际次数。

数据集

stephen.marquard@uct.ac.za
louis@media.berkeley.edu
zqian@umich.edu
rjlowe@iupui.edu
zqian@umich.edu
rjlowe@iupui.edu
cwen@iupui.edu
cwen@iupui.edu
gsilver@umich.edu
gsilver@umich.edu
zqian@umich.edu
gsilver@umich.edu
wagnermr@iupui.edu
zqian@umich.edu
antranig@caret.cam.ac.uk
gopal.ramasammycook@gmail.com
david.horwitz@uct.ac.za
david.horwitz@uct.ac.za
david.horwitz@uct.ac.za
david.horwitz@uct.ac.za
stephen.marquard@uct.ac.za
louis@media.berkeley.edu
louis@media.berkeley.edu
ray@media.berkeley.edu
cwen@iupui.edu
cwen@iupui.edu
cwen@iupui.edu.  

原代码

dic=dict()
lst=list()
handle = open('mbox-short.txt')
for words in handle:
        if words.startswith("From "):
         g=words.split()
         emails=g[1]
         lst.append(emails)
         for x in lst: 
            dic[x]=dic.get(x,0)+1 
print(dic) 

异常结果

{'stephen.marquard@uct.ac.za': 34, 'louis@media.berkeley.edu': 37, 'zqian@umich.edu': 79, 'rjlowe@iupui.edu': 46, 'cwen@iupui.edu': 47, 'gsilver@umich.edu': 53, 'wagnermr@iupui.edu': 15, 'antranig@caret.cam.ac.uk': 13, 'gopal.ramasammycook@gmail.com': 12, 'david.horwitz@uct.ac.za': 38, 'ray@media.berkeley.edu': 4}   

问题原因

核心错误是嵌套循环逻辑混乱:每次向列表lst添加一个邮箱后,立刻遍历整个列表更新字典计数。也就是说,每新增一个邮箱,之前所有已统计过的邮箱都会被再次累加一次。比如:

  • 第1个邮箱加入列表,遍历1次,计数为1
  • 第2个邮箱加入列表,遍历2次,两个邮箱各加1,第1个邮箱计数变为2,第2个为1
  • 第3个邮箱加入列表,遍历3次,三个邮箱各加1,第1个变为3,第2个变为2,第3个为1
    以此类推,最终每个邮箱的计数是它出现位置的累加值,而非实际出现次数。

修复方案

两种简单修复方式任选其一:

方案1:直接统计,无需列表

提取邮箱后直接更新字典,跳过列表存储步骤,避免嵌套循环:

email_counts = {}
handle = open('mbox-short.txt')
for line in handle:
    if line.startswith("From "):
        parts = line.split()
        email = parts[1]
        # 直接更新计数
        email_counts[email] = email_counts.get(email, 0) + 1
print(email_counts)

方案2:先存列表,再一次性统计

先把所有符合条件的邮箱存入列表,之后单独遍历列表统计字典,不嵌套循环:

email_counts = {}
email_list = []
handle = open('mbox-short.txt')
for line in handle:
    if line.startswith("From "):
        parts = line.split()
        email = parts[1]
        email_list.append(email)
# 遍历列表统计计数
for email in email_list:
    email_counts[email] = email_counts.get(email, 0) + 1
print(email_counts)

正确结果示例

运行修复后的代码,会得到符合实际的计数:

{'stephen.marquard@uct.ac.za': 2, 'louis@media.berkeley.edu': 3, 'zqian@umich.edu': 4, 'rjlowe@iupui.edu': 2, 'cwen@iupui.edu': 4, 'gsilver@umich.edu': 3, 'wagnermr@iupui.edu': 1, 'antranig@caret.cam.ac.uk': 1, 'gopal.ramasammycook@gmail.com': 1, 'david.horwitz@uct.ac.za': 4, 'ray@media.berkeley.edu': 1}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:15:46