【问题标题】:return the top n most frequently occurring chars and their respective counts in python返回 python 中出现频率最高的 n 个字符及其各自的计数
【发布时间】:2014-01-10 12:42:21
【问题描述】:

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

【问题讨论】:

  • 第一个样本中有 6 个 a 字符,而不是 5 个。

标签: python


【解决方案1】:

使用collections.Counter();它有一个most_common() 方法,就是这样

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

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

如果您使用 negative 计数作为排序键,而不是反向排序,那么您将在 c 之前再次排序 b

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

并不是说Counter.most_common() 在您要求的商品数量少于柜台中的钥匙数量时实际上使用了排序;它使用heapq-based algorithm 来仅获取前 N 项。

【讨论】:

  • 我这样做了,但我仍然得到相同的 o/p。你可以查看pythontutor.com/…链接了解详情
  • @RiteshBhat:当您要求前 2 名时,您永远不会得到 3 项作为输出。相反,在平局的情况下,您可以从平局位置获得尽可能多的键,以满足您的前 N ​​个请求,按反向排序顺序。
  • 哦,是的,我明白你所说的,并且 "list4.sort(key=lambda v: (-v[1], v[0))" 工作得很好,谢谢你
【解决方案2】:

有点难,但也有效:

text = "abbbaaaa"

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

print dict

【讨论】:

  • 但是使用这个我会得到一个字典,它的值和键需要被压缩以形成一个列表。我认为这也是不错的选择 :) 谢谢顺便说一句
  • 对不起,“to be zipped”你能不能解释的更清楚些,我都听不懂。
  • 我的意思是说,通过 list(zip(dict_values,dict_keys)) 我可以得到 (keys,values) 的组合作为一个列表。
【解决方案3】:

文本="abbbaaaa" 字典={ } 对于文本中的行: 对于排队的chae: dict[char]=dict.get(char,0)+1 打印字典

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2015-07-01
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多