#python #algorithm #count
Вопрос:
У меня есть текстовый файл, содержащий электронные письма и идентификаторы, он выглядит примерно так:
mark@gmail.com:1111111
matt@hotmail.com:12313
harry@gmail.com:121213
matthew@hotmail.com:12313
tom@yahoo.com:123113
Что я хочу сделать, так это создать код, чтобы подсчитать, сколько раз возникало электронное письмо, и перечислить их для меня.
Например:
@hotmail.com : 2
@gmail.com : 2
@yahoo.com : 1
Я создал код, который учитывает электронные письма, но он также учитывает их имя и идентификатор, которые мне не нужны
Вот код:
import string
# Open the file in read mode
text = open("sample.txt", "r")
# Create an empty dictionary
d = dict()
# Loop through each line of the file
for line in text:
# Remove the leading spaces and newline character
line = line.strip()
# Convert the characters in line to
# lowercase to avoid case mismatch
line = line.lower()
# Put a space behind @ and remove : with a space
line = line.replace("@", " @")
line = line.replace(":", " ")
# Split the line into words
words = line.split(" ")
# Iterate over each word in line
for word in words:
# Check if the word is already in dictionary
if word in d:
# Increment count of word by 1
d[word] = d[word] 1
else:
# Add the word to dictionary with count 1
d[word] = 1
# Print the contents of dictionary
for key in list(d.keys()):
print(key, ":", d[key])
Тогда результат будет выглядеть следующим образом:
mark : 1
@gmail.com : 2
1111111 : 1
matt : 1
@hotmail.com : 2
12313 : 2
harry : 1
121213 : 1
matthew : 1
tom : 1
@yahoo.com : 1
123113 : 1
Есть ли способ заставить считать только строки, начинающиеся с @?
Я очень новичок в python, поэтому ценю любую помощь! Спасибо
Ответ №1:
Вот простая альтернатива с использованием collections.Counter()
:
from collections import Counter
with open('sample.txt') as f:
c = Counter([_.strip().split('@')[1].split(':')[0].lower() for _ in f])
print(c)
Приведенный выше код приведет к чему-то вроде этого:
Counter({'gmail.com': 2, 'hotmail.com': 2, 'yahoo.com': 1})
Ответ №2:
Вот код.
line=line.strip("n").split(":")[0]
это основная линия. В нем говорится, что сначала разденьте "n"
персонажа, затем разделите его :
и возьмите первую часть.
from collections import Counter
with open("z.txt","r ") as file:
email=[]
read_lines=file.readlines()
for line in read_lines:
line=line.strip("n").split(":")[0]
x=line.index("@")
email.append(line[x:])
mail_servers=dict(Counter(email))
print("------ Search Found ------n")
for key,value in mail_servers.items():
print(key,":",value)
Выход:
------ Search Found ------
@gmail.com : 2
@hotmail.com : 2
@yahoo.com : 1
Ответ №3:
Хотите ли вы рассчитывать в отношении доменного имени (hotmail, yahoo, gmail и т.д.)? Например, сколько парней используют gmail или hotmail в качестве своей электронной почты и т. Д… В этом случае вы можете использовать следующий код:
dict_count = {}
domain_list = []
for element in lista:
res = re.findall(r'@w .w ', element)
domain_list.append(res)
domain_list = [item for sublist in t for item in sublist]
for item in domain_list:
if item not in dict_count:
dict_count[item] = 1
else:
dict_count[item] = 1
print(dict_count)
Большое спасибо
Ваши отзывы будут оценены по достоинству.
P.S. Here is the output:
{'@gmail.com': 2, '@hotmail.com': 2, '@yahoo.com': 1}
Ответ №4:
Способ решить эту проблему-добавить цикл for, чтобы просмотреть каждую строку текста и определить, есть ли в ней электронное письмо со словом @ и идентификатором, если в нем есть точка с запятой или цифры (если в электронных письмах нет цифр). Вот код.
# replace this
# Loop through each line of the file
for line in text:
# Remove the leading spaces and newline character
line = line.strip()
# with this
# Loop through each line of the file
for line in text:
if "@" in Email:
line == Email
else:
line == ID
И внутри вашего файла .txt вы можете указать им атрибут с именем Email для электронной почты и ID для идентификатора.
Например, следующее:
Email: Email@gmail.com
ID: ID
или что-то в этом роде.
РАСКРЫТИЕ ИНФОРМАЦИИ: Если есть что-то еще, что не является идентификатором или электронной почтой, код может не сработать.
Редактировать: Я имел в виду, что, как и в текстовом тексте, который я упомянул, не сработает, сделайте это сами, потому что я не знаю, как это сделать.