按频率排序计数器,然后按字母顺序在Python中排序

iFu*_*ion 3 python python-3.x python-collections

我试图使用计数器按出现次数对字母进行排序,并将任何具有相同频率的字符按字母顺序排列,但我无法访问它产生的字典的值.

letter_count = collections.Counter("alphabet")
print(letter_count)
Run Code Online (Sandbox Code Playgroud)

生产:

Counter({'a': 2, 'l': 1, 't': 1, 'p': 1, 'h': 1, 'e': 1, 'b': 1})
Run Code Online (Sandbox Code Playgroud)

如何按频率排序,然后按字母顺序排序,所以只显示一次的所有内容都按字母顺序排列?

Ary*_*thy 7

听起来你的问题是如何按频率对整个列表进行排序,然后按字母顺序打破关系.您可以像这样对整个列表进行排序:

>>> a = sorted(letter_count.items(), key=lambda item: (-item[1], item[0]))
>>> print(a)
# [('a', 2), ('b', 1), ('e', 1), ('h', 1), ('l', 1), ('p', 1), ('t', 1)]
Run Code Online (Sandbox Code Playgroud)

如果您希望输出仍然是dict,可以将其转换为collections.OrderedDict:

>>> collections.OrderedDict(a)
# OrderedDict([('a', 2),
#              ('b', 1),
#              ('e', 1),
#              ('h', 1),
#              ('l', 1),
#              ('p', 1),
#              ('t', 1)])
Run Code Online (Sandbox Code Playgroud)

如您所见,这保留了订购.'a'首先是因为它最常见.其他所有内容都按字母顺序排序.

  • 据我了解,之所以这么说是因为两次出现的条目已经放在列表的最前面;OP希望按字母顺序打破的hapax之间的纽带。 (2认同)

sab*_*rli 6

您可以在将输入传递到计数器之前对输入进行排序。

>>> Counter(sorted("alphabet")).most_common()
[('a', 2), ('b', 1), ('e', 1), ('h', 1), ('l', 1), ('p', 1), ('t', 1)]
Run Code Online (Sandbox Code Playgroud)

  • 请注意,只有当字典默认排序时,这才保证在 Python 3.7(2018 年 6 月发布)或更高版本中工作。 (2认同)