Как посчитать частоты / вхождения всех значений в строке - PullRequest
1 голос
/ 02 октября 2019

Мне нужно подсчитать все электронные письма в списке, однако некоторые электронные письма объединены вместе с символом |. Они должны быть разделены, и электронные письма должны быть подсчитаны после разделения, чтобы избежать получения неточного или низкого количества частот.

У меня есть список, похожий на этот:

test = ['abc@gmail.com', 'xyz@jad.com|abc@gmail.com', 'asd@ajf.com|abc@gmail.com', 'asdf@adh.com', 'xyz@jad.com']

Я выполнил набор операций для разделения, и когда я разделяю, труба заменяется двойными кавычками в этом месте, поэтому язамените двойные одинарными кавычками, чтобы все электронные адреса были заключены в одинарные кавычки.

# convert list to a string
test_str = str(test)

# apply string operation to split by separator '|'
test1 = test_str.split('|')
print(test1)

--> OUTPUT of above print statement:   ["['abc@gmail.com', 'xyz@jad.com", "abc@gmail.com', 'asd@ajf.com", "abc@gmail.com', 'asdf@adh.com', 'xyz@jad.com']"]

test2 = str(test1)
test3 = test2.replace('"','')
print(test3)

--> OUTPUT of above print statement: [['abc@gmail.com', 'xyz@jad.com', 'abc@gmail.com', 'asd@ajf.com', 'abc@gmail.com', 'asdf@adh.com', 'xyz@jad.com']]

Как теперь я могу получить количество всех электронных писем? По сути, это строка, и если это список, я мог бы использовать collection.Counter, чтобы легко получить счетчик.

Я хотел бы получить список, подобный приведенному ниже, с адресом электронной почты и счетчиком впо убыванию частоты

 ['abc@gmail.com': 3, 'xyz@jad.com': 2, 'asd@ajf.com': 1, 'asdf@adh.com': 1]

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Как насчет перебора списка и вызова counter.update для каждой строки? Как это:

test = ['abc@gmail.com', 'xyz@jad.com|abc@gmail.com', 'asd@ajf.com|abc@gmail.com', 'asdf@adh.com', 'xyz@jad.com']
c = Counter()
for email_str in test:
    if email_str:
        c.update(email_str.split('|'))
res = c.most_common()
1 голос
/ 02 октября 2019

Вы можете использовать collections.Counter с выражением генератора, которое перебирает входной список строк, а затем перебирает подсписок электронных писем, разбивая строки. Используйте метод most_common, чтобы обеспечить нисходящий порядок отсчетов:

from collections import Counter
dict(Counter(e for s in test if s for e in s.split('|')).most_common())

Возвращает:

{'abc@gmail.com': 3, 'xyz@jad.com': 2, 'asd@ajf.com': 1, 'asdf@adh.com': 1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...