Python 查找txt文件中出现次数最多的电子邮件地址
我必须通过一个包含各种信息的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:
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没有询问存在哪些其他方法,它们有很多种,但为什么它们的代码没有给出预期的输出。正如其他人指出的,有更好的实践来完成您试图完成的任务,即使用正则表达式。。正如其他人所指出的,有更好的实践来做你想做的事情,即使用正则表达式。。等