Python 查找txt文件中出现次数最多的电子邮件地址

Python 查找txt文件中出现次数最多的电子邮件地址,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我必须通过一个包含各种信息的txt文件,并提取其中出现最多的电子邮件地址 我的代码如下,但它不工作。它没有打印输出,我不知道为什么。代码如下: name = input("Enter file:") if len(name) < 1 : name = "mbox-short.txt" handle = open(name) names = handle.readlines() count = dict() for name in names:

我必须通过一个包含各种信息的txt文件,并提取其中出现最多的电子邮件地址

我的代码如下,但它不工作。它没有打印输出,我不知道为什么。代码如下:

name = input("Enter file:")
if len(name) < 1 : name = "mbox-short.txt"
handle = open(name)
names = handle.readlines()
count = dict()
for name in names:
    name = name.split()
    for letters in name:
        if '@' not in letters: 
            name.remove(letters)
        else: 
            continue
    name = str(name)
    if name not in count:
        count[name] = 1
    else: 
        count[name] = count[name]+ 1
print(max(count, key=count.get(1)))
据我所知,该代码的工作原理如下:

我们首先打开文件,然后读取行,然后创建一个空的dict

然后在第一个for循环中,我们根据每一行将txt文件拆分为一个列表。 然后,在第二个for循环中,对于每行中的每个项目,如果没有@,则将其删除。 然后,我们返回原始for循环,其中,如果名称不是dict中的键,则将其与值1相加;否则,它的价值会增加一个

最后,我们打印最大键和值

我哪里出错了


提前感谢您的帮助。

请使用以下代码:

names = '''hola@hola.com
whatsap@hola.com
hola@hola.com
hola@hola.com
klk@klk.com
klk@klk.com
klk@klk.com
klk@klk.com
klk@klk.com
whatsap@hola.com'''
count = list(names.split("\n"))
sett = set(names.split("\n"))

highest = count.count(count[0])
theone = count[0]
for i in sett:
    l = count.count(i)
    if l > highest:
        highest = l
        theone = i
print(theone)
输出:

klk@klk.com

请使用以下代码:

names = '''hola@hola.com
whatsap@hola.com
hola@hola.com
hola@hola.com
klk@klk.com
klk@klk.com
klk@klk.com
klk@klk.com
klk@klk.com
whatsap@hola.com'''
count = list(names.split("\n"))
sett = set(names.split("\n"))

highest = count.count(count[0])
theone = count[0]
for i in sett:
    l = count.count(i)
    if l > highest:
        highest = l
        theone = i
print(theone)
输出:

klk@klk.com

您需要将最后一行更改为:

print(max(count, key=count.get))
编辑

为了进一步解释:

您通过key=count.get1向max提供了错误的排序函数

因此,当传递给get的关键参数不在字典中时,count.get1将返回默认值或None


如果是这样的话,只要所有键都是字符串且字典不为空,max就会在字典中输出max string键。

您需要将最后一行更改为:

print(max(count, key=count.get))
编辑

为了进一步解释:

您通过key=count.get1向max提供了错误的排序函数

因此,当传递给get的关键参数不在字典中时,count.get1将返回默认值或None


如果是这样的话,只要所有键都是字符串且字典不为空,max就会在字典中输出max string键。

导入正则表达式re,因为它有助于获取电子邮件

import re
name = input("Enter file:")
if len(name) < 1 : name = "mbox-short.txt"
handle = open(name)
names = "\n".join(handle.readlines())
email_ids = re.findall(r"[0-9a-zA-Z._+%]+@[0-9a-zA-Z._+%]+[.][0-9a-zA-Z.]+", names)
email_ids = [(email_ids.count(email_id), email_id) for email_id in email_ids].sort(reverse=True)
email_ids = set([i[1] for i in email_ids)
在变量email_id中,您将获得一组根据其出现情况按降序排列的电子邮件


我知道代码很长,并且有一些多余的行,但是有一些代码可以让代码不言自明。

导入正则表达式re,因为它将有助于获取电子邮件

import re
name = input("Enter file:")
if len(name) < 1 : name = "mbox-short.txt"
handle = open(name)
names = "\n".join(handle.readlines())
email_ids = re.findall(r"[0-9a-zA-Z._+%]+@[0-9a-zA-Z._+%]+[.][0-9a-zA-Z.]+", names)
email_ids = [(email_ids.count(email_id), email_id) for email_id in email_ids].sort(reverse=True)
email_ids = set([i[1] for i in email_ids)
在变量email_id中,您将获得一组根据其出现情况按降序排列的电子邮件


我知道代码很长,并且有一些多余的行,但是有一些行可以让代码变得不言自明。

如果没有输出,报告了哪些错误?您是否检查了名称是否包含预期的文本,计数是否包含预期的条目?这缩小了你问题的根源。对于未来的问题,将帮助您解决常见的bug在哪里?问题。谢谢T先生的链接!Lol读完这篇文章后,我要为我糟糕的礼仪道歉。如果没有输出,报告了什么错误?你检查过名称是否包含预期的文本,计数是否包含预期的条目吗?这缩小了你问题的根源。对于未来的问题,将帮助您解决常见的bug在哪里?问题。谢谢T先生的链接!哈哈,看完这篇文章后,我要为我糟糕的礼仪道歉。这不是问题的答案。OP没有问还有什么其他的方法,它们有很多,但是为什么它们的代码没有给出预期的输出。这不是问题的答案。OP没有询问存在哪些其他方法,它们有很多种,但为什么它们的代码没有给出预期的输出。正如其他人指出的,有更好的实践来完成您试图完成的任务,即使用正则表达式。。正如其他人所指出的,有更好的实践来做你想做的事情,即使用正则表达式。。等