如何按频率和字母顺序对列表进行排序?

时间:2018-07-27 04:09:18

标签: python

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)]

由于频率相同,因此必须按字母顺序进行排序。那么如何按频率按字母顺序对列表“计数”进行排序?

3 个答案:

答案 0 :(得分:4)

Python docs

所示
  

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)]