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

返回python中最频繁出现的前n个字符及其各自的计数,python,Python,如何返回前n个最常出现的字符及其各自的计数#例如'aaaaaa bbbbccc',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 f

如何返回前n个最常出现的字符及其各自的计数#例如
'aaaaaa bbbbccc'
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)]

使用集合。计数器();它有一个
最常见的()
方法,它可以实现这一点:

>>> from collections import Counter
>>> counts = Counter('aaaaaabbbbcccc')
>>> counts.most_common(2)
[('a', 6), ('c', 4)]
请注意,对于上述输入和
aabc
中的
b
c
都具有相同的计数,并且都可以是有效的顶级竞争者。因为您和
计数器
都是按计数排序,然后按相反键,
c
b
之前排序

如果不是反向排序,而是使用负计数作为排序键,则应在
c
之前再次排序
b

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

不是计数器。大多数常用的()实际上是在你要的物品少于计数器中的钥匙时使用排序;它使用a而不是只获取前N个项目。

使用
collections.Counter()
;它有一个
最常见的()
方法,它可以实现这一点:

>>> from collections import Counter
>>> counts = Counter('aaaaaabbbbcccc')
>>> counts.most_common(2)
[('a', 6), ('c', 4)]
请注意,对于上述输入和
aabc
中的
b
c
都具有相同的计数,并且都可以是有效的顶级竞争者。因为您和
计数器
都是按计数排序,然后按相反键,
c
b
之前排序

如果不是反向排序,而是使用负计数作为排序键,则应在
c
之前再次排序
b

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

不是计数器。大多数常用的()实际上是在你要的物品少于计数器中的钥匙时使用排序;它使用a而不是只获取前N个项目。

稍微难一点,但也可以:

text = "abbbaaaa"

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

print dict

稍微努力一点,但也有效:

text = "abbbaaaa"

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

print dict

您的第一个样本中有六个
a
字符,而不是五个。您的第一个样本中有六个
a
字符,而不是五个。我这样做了,但仍然得到相同的o/p。你可以检查链接是否有错误details@RiteshBhat:当您要求前2项时,您永远不会得到3项作为输出。相反,在打成平局的情况下,你可以从打成平局的位置按需要获得尽可能多的键,以满足你的前N个请求,顺序相反。哦,是的,我理解你所说的和“list4.sort(key=lambda v:(-v[1],v[0])”工作很好,感谢用户界面这么做,但我仍然得到相同的o/p。U可以检查链接details@RiteshBhat:当你要求前2名时,你永远不会得到3个项目作为输出。相反,在平局的情况下,你从平局的位置获得所需数量的钥匙,以满足你的前N名要求,顺序相反。哦,是的,我理解你说的,并且“list4.sort(key=lambda v:(-v[1],v[0])”很好地工作了,谢谢uBut使用这个我将得到一个dict,它的值和键需要压缩以形成一个列表。我认为这也是一个很好的选择:)谢谢btwSorry,你能更好地解释“被压缩”吗,我不完全理解。我的意思是说,通过使用list(zip(dict_值,dict_键))我可以将(键、值)的组合作为一个列表。但是使用这个,我会得到一个dict,它的值和键需要压缩以形成一个列表。我认为这也是一个不错的选择:)谢谢你,对不起,你能更好地解释“被压缩”吗?我不完全理解。我的意思是说,通过做列表(zip(dict_值、dict_键))我可以将(键、值)的组合作为列表。