python词典:值和我的代码中不对应的键来查找max

时间:2016-11-14 05:46:07

标签: python sorting max

我的目标是找出文件在这里的消息最多的人。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行。如何解决?

似乎我没有保存钥匙。 谢谢大家。

谢谢大家。我解决了 在第二个循环中,我创建了一个变量来保存密钥

3 个答案:

答案 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))