[英]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.