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

问题描述:

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

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

生产:

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

我怎样才能得到它下令频率,然后按字母顺序排列,所以一切只能一次显示出来是按字母顺序排列?

+0

可以使用适当命名的'letter_count.values访问值()'。 –

+0

@OP,你可以通过澄清你的意图来帮助我们。按照字母顺序打破关系的频率,还是按照单次出现的字母排序*整个*计数器? –

这听起来像你的问题是如何按频率排序整个列表,然后按字母顺序打破关系。您可以排序整个列表是这样的:如果你想输出是一个字典仍然

>>> 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'。其他一切按字母顺序排序。

+1

我不明白这是如何“得到所有只发生过一次的字母” –

+1

据我所知,这是因为两次出现的入口已经放在列表的前面; OP要求按字母顺序打破hapax之间的联系。 –

+0

公平点。现在就躲过那种语法。 –

以这种方式:

for l in letter_count: 
    if letter_count[l] == 1: 
     print(l) # or do what you want 

需要注意的是在按键上(你的信)集合迭代在foreach。 然后你是否与键关联的值正好是1

+0

这不会对结果排序。 –

+0

问题已由OP澄清;你可能想要更新你的答案。 –

你可以试试这个:

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。

+0

问题已由OP澄清;你可能想要更新你的答案。 –

为了完整起见,以获得单字母出现的字母顺序:

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

问题已由OP澄清;你可能想要更新你的答案。 –