如何按字母顺序对计数器进行排序,然后按Python中的值顺序排序

时间:2017-07-12 01:56:53

标签: python sorting counter

我有一个计数器,我想按以下方式排序:

Counter({'M': 9, 'L': 5, 'P': 5, 'S': 2, 'd': 1, 'T': 1})

当我使用我的代码时,这就是它给我的内容:

Counter({'M': 9, 'P': 5, 'L': 5, 'S': 2, 'T': 1, 'd': 1})

我尝试了函数sorted(),但是当我使用它时,它的返回值不再是计数器了。

这是我的代码,你会怎么做?

def most_encountered_letters(dictionnary):
    counter = collections.Counter()
    for line in dictionnary:
        words = line.split(',')[0].split(' ')
        for word in words:
            counter[word[0]] += 1

    print(counter)                                                                                                        
    return counter.most_common(5)

1 个答案:

答案 0 :(得分:2)

Counter是无序的。它们是dict的子类,与dict类似,不是有序的。说“排序Counter”是没有意义的。您可以获取Counter中按所需方式排序的项目列表,例如:

>>> from collections import Counter
>>> c = Counter({'M': 9, 'L': 5, 'P': 5, 'S': 2, 'd': 1, 'T': 1})
>>> c
Counter({'M': 9, 'L': 5, 'P': 5, 'S': 2, 'T': 1, 'd': 1})
>>> sorted(c.items(), key= lambda t: (t[1], t[0]), reverse=True)
[('M', 9), ('P', 5), ('L', 5), ('S', 2), ('d', 1), ('T', 1)]

如果您想要一个有序的Mapping类型,则必须使用内置的OrderedDict,或者实现自己的class OrderedCounter(Counter, OrderedDict): 'Counter that remembers the order elements are first encountered' def __repr__(self): return '%s(%r)' % (self.__class__.__name__, OrderedDict(self)) def __reduce__(self): return self.__class__, (OrderedDict(self),) 。我们可以使用多重继承来重用内置类来获得我们想要的东西。这是一个食谱straight from the docs

>>> oc = OrderedCounter()
>>> for k,v in sorted(c.items(), key= lambda t: (t[1], t[0]), reverse=True):
...     oc[k] = v
...
>>> oc
OrderedCounter(OrderedDict([('M', 9), ('P', 5), ('L', 5), ('S', 2), ('d', 1), ('T', 1)]))
>>> for k,v in oc.items():
...   print(k,v)
...
M 9
P 5
L 5
S 2
d 1
T 1
>>>

所以,在行动中:

Counter

更重要的是,你应该考虑为什么你需要一个有序的class Foo { multi method do-it { put "Default" } multi method do-it ( Int $n ) { put "Int method" } multi method do-it ( Str $s ) { put "Str method" } multi method do-it ( Rat $r ) { put "Rat method" } } class Bar is Foo { multi method do-it { put "Bar method" } multi method do-it (*@a) { put "Bar slurpy method" } } Foo.new.do-it: 1; Foo.new.do-it: 'Perl 6'; Foo.new.do-it: <1/137>; Foo.new.do-it; put '-' x 10; Bar.new.do-it: 1; Bar.new.do-it: 'Perl 6'; Bar.new.do-it: <1/137>; Bar.new.do-it: 5+3i; Bar.new.do-it; ...你真的需要一个吗?