使用字典统计邮箱出现次数结果偏高的原因及修复方法
邮箱计数异常的原因与修复方案
问题背景
需要统计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
相关产品推荐
相关产品推荐

