Python新手疑问:循环外的变量w为何输出出现次数最多的邮箱?
问题解答
首先明确:你得到正确结果不是字典的功能导致的,纯粹是巧合——你的代码逻辑其实有漏洞,只是刚好在测试文件mbox-short.txt里,最后一次出现的From 行对应的邮箱,正好是出现次数最多的那个。
原代码的问题分析
你的代码里,变量w在循环中每次遇到From 开头的行时,都会被重新赋值为当前行的邮箱地址。循环结束后,w保留的是最后一次被赋值的邮箱,也就是文件里最后一个From 行的发件人。如果换一个测试文件,最后出现的邮箱不是次数最多的,你的代码就会输出错误的结果。
比如假设文件里最后一个From 行的邮箱是test@example.com,但它只出现了1次,而freq@example.com出现了5次,你的代码会错误输出test@example.com 1,而不是正确的高频邮箱。
正确的实现方式
要真正找出出现次数最多的邮箱,应该遍历字典的键值对,找出值最大的那一组。可以用max()函数结合key参数来实现:
name = input("Enter file: ") if len(name) < 1: name = "mbox-short.txt" handle = open(name) sender = dict() for line in handle: line = line.rstrip() words = line.split() if line.startswith("From "): w = words[1] sender[w] = sender.get(w, 0) + 1 # 找出次数最多的邮箱和对应的次数 max_email, max_count = max(sender.items(), key=lambda x: x[1]) print(max_email, max_count)
补充说明
sender.items()会返回字典中所有的键值对(比如('a@b.com', 3)这样的元组)key=lambda x: x[1]告诉max()函数,按照元组的第二个元素(也就是次数)来比较大小,找出最大的那一组
内容的提问来源于stack exchange,提问作者David Deist
相关产品推荐
相关产品推荐

