Найдите адрес электронной почты, который чаще всего встречается в текстовом файле

#python #python-3.x #dictionary

#python #python-3.x #словарь

Вопрос:

Мне нужно просмотреть текстовый файл, который содержит всевозможную информацию, и извлечь адрес электронной почты, который встречается чаще всего.

Мой код выглядит следующим образом, но он не работает. Он не выводит выходные данные, и я не уверен, почему. Вот код:

 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 мы разбиваем текстовый файл на список на основе каждой строки. Затем во втором цикле for для каждого элемента в каждой строке, если нет @ , он удаляется. Затем мы возвращаемся к исходному циклу for , где, если имя не является ключом в dict, к нему добавляется значение 1; в противном случае к его значению добавляется единица.

Наконец, мы печатаем максимальный ключ и значение.

Где я ошибся???

Заранее благодарю вас за помощь.

Комментарии:

1. Если выходных данных нет, о каких ошибках сообщалось?

2. Вы проверили, что names он содержит ожидаемый текст и counts содержит ожидаемые записи? Это сужает источник вашей проблемы. Для решения будущих проблем эта запись в блоге поможет вам решить распространенный вопрос «Где ошибка?» вопрос.

3. Спасибо за ссылку, мистер Т! Лол, прочитав это, я должен извиниться за свой плохой этикет здесь

Ответ №1:

Вам нужно изменить последнюю строку на:

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

Редактировать

Для более подробного объяснения:

Вы предоставляли max() неправильную функцию упорядочения по key=count.get(1) .

Таким образом, count.get(1) будет возвращено значение по умолчанию или None, если переданный вами ключевой аргумент get() отсутствует в словаре.

Если это так, max() то будет ли он вести себя путем вывода максимального строкового ключа в вашем словаре (при условии, что все ваши ключи являются строками, а ваш словарь не пуст).

Комментарии:

1. Как указывали другие, существуют более эффективные методы для выполнения того, что вы пытаетесь сделать (т.Е. С использованием регулярных выражений .. и т. Д.).

Ответ №2:

Пожалуйста, используйте следующий код:

 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
  

Комментарии:

1. Это не ответ на вопрос. OP не спрашивал, какие существуют другие подходы (их много), но почему их код не дает ожидаемого результата.

Ответ №3:

Импортируйте регулярные выражения ( 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_ids вы получите набор электронных писем, упорядоченных на основе их появления, в порядке убывания.

Я знаю, что code он длинный и содержит несколько избыточных строк, но там есть, чтобы сделать code его понятным.