繁体   English   中英

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

[英]How to sort counter by alphabetical order THEN by value order in Python

我有一个柜台,我想按以下方式排序:

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)

Counter s是无序的。 它们是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或实现自己的。 我们可以使用多重继承来重用内置类以获得所需的内容。 这是直接来自docs的食谱:

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

因此,实际上:

>>> 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 ……您真的需要一个Counter吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM