嵌套for循环更新Python字典出错求助(Coursera作业9.5)
统计邮件发送次数的代码错误原因分析
在Coursera《Python for Everybody》课程的作业9.5中,需求是读取mbox-short.txt文件,统计所有以From 开头的行里第二个单词(发件人邮箱)的出现次数,并将结果存入Python字典。提交的错误代码因为嵌套了多余的for循环,导致字典里的邮箱计数远高于实际次数,以下是具体分析:
错误代码
handle = open(name) indirizzi = dict() for line in handle : if not line.startswith("From "): continue word = line.split() # 问题出在这里 for mail in word: mail = word[1] indirizzi[mail] = indirizzi.get(mail, 0) + 1
错误原因
当处理一行From 开头的内容时,line.split()会把整行拆分成一个包含多个元素的列表(比如典型的行拆分后会有日期、邮箱、时间等多个元素)。你额外嵌套的for mail in word:循环,会遍历这个列表里的每一个元素——但每次循环你都把mail强制赋值为word[1](也就是目标邮箱地址),然后给这个邮箱的计数加1。
举个例子:如果某一行拆分后有6个元素,那这一行就会给同一个邮箱连续加6次计数,而不是正确的1次。这就是为什么最终统计出来的数值会远高于实际出现的次数。
正确代码
name = input("Enter file:") if len(name) < 1 : name = "mbox-short.txt" handle = open(name) emcount = dict() for line in handle: if not line.startswith("From "): continue line = line.split() line = line[1] emcount[line] = emcount.get(line, 0) + 1
内容的提问来源于stack exchange,提问作者Bomb Michele
相关产品推荐
相关产品推荐

