我的目标是找出文件在这里的消息最多的人。mbox-short.txt。 我的代码在这里。
fhand = open('mbox-short.txt')
counts = dict()
#this loop is to creat a dictionary in which key is the mail's name
#value is times the mail's name appeared
for line in fhand:
if not (line.startswith('From')and not line.startswith('From:')):
continue
words = line.split()
counts[words[1]] = counts.get(words[1],0) + 1
num = None
#this loop is to find max value and its key
for key, value in counts.items():
#print key, value
if num == None or counts[key] > num:
num = counts[key]
print key, num.
我运行代码后。结果是:
但是当我在第二个循环中运行打印键,值时,注释打印键下面的行,值,结果显示该光线@ media.berkeley.edu是1而不是5.cwen@input.edu是5。 那么为什么关键和价值不对应。我问题就在第19行。如何解决?
似乎我没有保存钥匙。 谢谢大家。
谢谢大家。我解决了 在第二个循环中,我创建了一个变量来保存密钥
答案 0 :(得分:0)
我不确定我是否明白你想做什么。第一个循环应该计算所有地址,第二个应该找到最大值?
你必须使用某些值来num
,但我会选择零。然后你没有检查num == None
。而且你保存密钥,而不仅仅是价值。密钥永远是字典中的最后一个密钥。
答案 1 :(得分:0)
当你意识到你需要存储给出最大值的键时,或者至少存储最大值。然后,您不需要存储num,即目前为止的最大counts[key]
值,只需要存储max_key
的密钥。
此外,您使用counts
迭代for key, value in counts: ...
中的项目,但忽略循环内的value
。使用value
;没有必要再次查找counts[key]
。只要counts
具有> = 1项,您就不需要设置num = None
的悲观主义,然后在循环中对其进行测试。无论如何,num是不必要的。
# Iterative approach
max_key = counts.keys()[0] # default assumption
for key, value in counts.items():
if value > counts[max_key]:
max_key = key
但你可以通过直接找到max而不需要迭代来避免这一切:
# Direct approach, using `max(..., key=...)`
max_key = max(counts, key=lambda kv: kv[1])
print max_key, counts[max_key]
cwen@iupui.edu 5
这是有效的,因为Python sorted(), max(), min()
将接受一个字典,并且它们有一个可选参数key
,它允许您传入一个函数,告诉比较每个项目中要使用的元素。
查看sorted(), max(), min()
的文档,并阅读有关使用它们的Python习语。
还有@Burhan引用的自定义collections.Counter
。但是学习如何先对事物进行排序很重要。然后你可以使用它。
答案 2 :(得分:0)
您需要使用专为此目的而设计的Counter
类:
import re
from collections import Counter
with open('mbox-short.txt') as f:
emails = Counter([i.strip() for i in re.findall(r'From:(.*?)', f.read(), re.M)])
for email, count in emails.most_common():
print('{} - {}'.format(email, count))