#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
его понятным.