def count_words(s, n):
"""Return the n most frequently occuring words in s."""
# TODO: Count the number of occurences of each word in s
words = s.split()
counts = Counter(words)
# TODO: Sort the occurences in descending order (alphabetically in case of ties)
# TODO: Return the top n most frequent words.
return counts.most_common(n)
print count_words("betty bought a bit of butter but the butter was bitter", 3)
当前输出为:
[('butter', 2), ('a', 1), ('bitter', 1)]
但是必需的是:
[('butter', 2), ('a', 1), ('betty', 1)]
由于频率相同,因此必须按字母顺序进行排序。那么如何按频率按字母顺序对列表“计数”进行排序?
答案 0 :(得分:4)
most_common([n])
将n个最常见的元素及其计数从最常见到最少的列表返回。如果省略n或None,则most_common()返回计数器中的所有元素。 具有相等计数的元素是任意排序的 :
因此,由于基础结构是dict
,因此不能保证以1列出的数字的顺序是特定的。
如果您希望按字母顺序显示结果,则需要进行更多处理。
from collections import Counter
c = Counter() #counter generating code
print sorted(c.most_common(), key=lambda i: (-i[1], i[0]))[:3]
这基本上会首先获取您所有的结果。 .most_common()
,然后按sorts them降序排列第二个参数(单词频率),然后按升序排列第一个参数(单词)。最后,将前三个元素中的slice用于结果。
编辑:我意识到我的排序不正确,itemgetter
仅限于升序。
答案 1 :(得分:3)
您可以通过指定按键功能来实现
>>> L = [('butter', 2), ('a', 1), ('bitter', 1), ('betty', 1)]
>>> sorted(L, key=lambda x: (-x[1], x[0]))
[('butter', 2), ('a', 1), ('betty', 1), ('bitter', 1)]
由于Python的排序是稳定的,因此另一种方法是先按字母顺序排序,然后再按计数反向排序
>>> from operator import itemgetter
>>> sorted(sorted(L), key=itemgetter(1), reverse=True)
[('butter', 2), ('a', 1), ('betty', 1), ('bitter', 1)]
答案 2 :(得分:0)
首先使用存储桶的概念对所有单词进行计数,该概念由字典定义,其中关键字是单词,值是出现的次数。
>>> bucket = {}
>>> for word in words:
... if word in bucket:
... bucket[word] += 1
... else:
... bucket[word] = 1
...
>>> bucket
{'betty': 1, 'bought': 1, 'a': 1, 'bit': 1, 'of': 1, 'butter': 2, 'but': 1, 'the': 1, 'was': 1, 'bitter': 1}
您可以使用不带参数的排序函数来按键名进行排序。
>>> sorted(bucket)
['a', 'betty', 'bit', 'bitter', 'bought', 'but', 'butter', 'of', 'the', 'was']
然后按从高到低的值排序:
>>> sorted(bucket.items(), key=lambda kv_pair: kv_pair[1], reverse=True)
[('butter', 2), ('betty', 1), ('bought', 1), ('a', 1), ('bit', 1), ('of', 1), ('but', 1), ('the', 1), ('was', 1), ('bitter', 1)]