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

时间:2017-05-19 17:57:29

标签: python python-3.x python-collections

我正在尝试使用counter来按字母顺序对字母进行排序,并将具有相同频率的任何字母按字母顺序排列,但我无法访问它产生的字典的值。

letter_count = collections.Counter("alphabet")
print(letter_count)

产生

Counter({'a': 2, 'l': 1, 't': 1, 'p': 1, 'h': 1, 'e': 1, 'b': 1})

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

4 个答案:

答案 0 :(得分:6)

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

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

你可以试试这个:

letter_count = collections.Counter("alphabet")

the_letters = [a for a, b in letter_count.items() if b == 1]
letters.sort()
print("letters that occur only once:")

for i in the_letters:
     print(i)

此代码使用列表推导创建一个仅出现一次的所有字母的列表,然后将它们全部打印出来。 items()返回一个键值对,可用于确定键的值是否等于1。

答案 3 :(得分:0)

为了完整起见,要按字母顺序获取单次出现的字母:

letter_count = collections.Counter("alphabet")

single_occurrences = sorted([letter for letter, occurrence in letter_count.items() if occurrence == 1])
print(single_occurrences)
# prints: ['b', 'e', 'h', 'l', 'p', 't']