Python 如何计算字符串中所有值的频率/出现次数

Python 如何计算字符串中所有值的频率/出现次数,python,python-3.x,string,list,Python,Python 3.x,String,List,我需要一个列表中所有电子邮件的计数,但是其中一些电子邮件是用|符号合并在一起的。这些需要被分割,并且在分割后需要对电子邮件进行计数,以避免频率计数不准确或过低 我有一个类似这样的列表: test = ['abc@gmail.com', 'xyz@jad.com|abc@gmail.com', 'asd@ajf.com|abc@gmail.com', 'asdf@adh.com', 'xyz@jad.com'] 我执行了一组拆分操作,当我拆分时,管道在该位置被双引号替换,因此我将双引号替换为单引

我需要一个列表中所有电子邮件的计数,但是其中一些电子邮件是用
|
符号合并在一起的。这些需要被分割,并且在分割后需要对电子邮件进行计数,以避免频率计数不准确或过低

我有一个类似这样的列表:

test = ['abc@gmail.com', 'xyz@jad.com|abc@gmail.com', 'asd@ajf.com|abc@gmail.com', 'asdf@adh.com', 'xyz@jad.com']
我执行了一组拆分操作,当我拆分时,管道在该位置被双引号替换,因此我将双引号替换为单引号,以便将所有电子邮件ID括在单引号中

# 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']]
我现在如何获得所有电子邮件的计数?这本质上是一个字符串,如果它是一个列表,我可以使用collections.Counter轻松获得计数

我想得到一个类似下面列出的列表,其中包含电子邮件和数量,按频率降序排列

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

谢谢你的帮助

您可以将
collections.Counter
与生成器表达式一起使用,该表达式迭代字符串的输入列表,然后通过拆分字符串来迭代电子邮件的子列表。使用
最常用的
方法确保计数的降序:

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}

对列表进行迭代并对每个字符串调用
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()

太好了。我有一个问题。如果列表由非类型值组成,该怎么办。测试=['abc@gmail.com', 'xyz@jad.com|abc@gmail.com”“没有asd@ajf.com|abc@gmail.com', 'asdf@adh.com', 'xyz@jad.com“]我怎样才能去掉它并使用上面的函数呢?顺便说一句,如果没有None值,这个函数就可以工作。非常感谢。我已经用一个过滤器更新了我的答案,该过滤器过滤掉
项。这对当前列表也有效!谢谢但是,如果存在“无”值,则该值将不起作用。我如何才能使它与我的列表中的非类型值一起工作?非常感谢!我感谢你的帮助和快速反应。必须完成我的代码!