按频率排序计数器,然后按字母顺序排列(Python)

11

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

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

产生:

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

如何按照频率和字母顺序排序,以便只出现一次的所有内容都按字母顺序排列?请保留HTML标签。
4个回答

15
似乎您的问题是如何按照频率对整个列表进行排序,然后按字母顺序打破平局。您可以像这样对整个列表进行排序:
>>> 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)]

如果您仍希望输出为字典,可以将其转换为collections.OrderedDict
>>> collections.OrderedDict(a)
# OrderedDict([('a', 2),
#              ('b', 1),
#              ('e', 1),
#              ('h', 1),
#              ('l', 1),
#              ('p', 1),
#              ('t', 1)])

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

2
据我理解,这是因为出现两次的条目已经被放在列表的前面了;原帖作者希望单词表中只保留一个,并按字母顺序排列。 - Arya McCarthy
没错,那正是我想要做的。谢谢。 - iFunction
这段程序相关的内容应翻译为:lambda item: (-item[1], item[0] 它的确切作用是什么? - kirti purohit
@kirtipurohit,减号用于使用反向排序(未使用par reverse)。对于配对(item[1],item[0]),首先按item[1]排序,然后,如果项目在item[1]上相等,则按item[0]排序。这里的item[1]是频率,而item[0]是字符符号。 - taciturno

6

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

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

2
请注意,此代码仅在Python 3.7(于2018年6月发布)或更高版本中保证可用,因为默认情况下字典已排序。 - Arya McCarthy

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。


1
问题已经被提问者澄清了,你可能需要更新你的回答。 - Arya McCarthy

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

问题已经被提问者澄清,您可能需要更新您的答案。 - Arya McCarthy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接