在python中返回前n个最常出现的字符及其各自的计数

时间:2014-01-10 12:42:22

标签: python

如何返回前n个最常出现的字符及其各自的计数#like 'aaaaaabbbbcccc'2应该在python中返回[('a', 6), ('b', 4)]

我试过这个

def top_chars(input, n):
    list1=list(input)
    list3=[]
    list2=[]
    list4=[]
    set1=set(list1)
    list2=list(set1)
    def count(item):
        count=0
        for x in input:
            if x in input:
                count+=item.count(x)
        list3.append(count)
        return count

    list2.sort(key=count)

    list3.sort()
    list4=list(zip(list2,list3))
    list4.reverse()
    list4.sort(key=lambda list4: ((list4[1]),(list4[0])), reverse=True)
    return list4[0:n]
    pass

但它不适用于输入(“aabc”,2) 它应该给出的输出是

[('a', 2), ('b', 1)]

但我得到的输出是

[('a', 2), ('c', 1)]

2 个答案:

答案 0 :(得分:8)

使用collections.Counter();它有一个most_common()方法可以

>>> from collections import Counter
>>> counts = Counter('aaaaaabbbbcccc')
>>> counts.most_common(2)
[('a', 6), ('c', 4)]

请注意,对于上述输入和aabcbc都具有相同的计数,并且两者都可以是有效的顶级竞争者。由于您和Counter按计数排序然后键入反向,c会在b之前排序。

如果不是反过来排序,而是使用否定计数作为排序键,则再次在b之前对c进行排序:

list4.sort(key=lambda v: (-v[1], v[0))

当您要求的物品少于柜台中的钥匙时,Counter.most_common()实际上不会使用分拣;它使用heapq-based algorithm代替只获得前N个项目。

答案 1 :(得分:0)

稍微努力,但也有效:

text = "abbbaaaa"

dict = {}
for lines in text:
    for char in lines:
        dict[char] = dict.get(char, 0) + 1

print dict