如何按价值sorting计数器? – python

除了列表理解逆序列表理解,有没有pythonic的方式来按价值sorting计数器? 如果是这样,它比这个更快:

>>> from collections import Counter >>> x = Counter({'a':5, 'b':3, 'c':7}) >>> sorted(x) ['a', 'b', 'c'] >>> sorted(x.items()) [('a', 5), ('b', 3), ('c', 7)] >>> [(l,k) for k,l in sorted([(j,i) for i,j in x.items()])] [('b', 3), ('a', 5), ('c', 7)] >>> [(l,k) for k,l in sorted([(j,i) for i,j in x.items()], reverse=True)] [('c', 7), ('a', 5), ('b', 3) 

使用Counter.most_common()方法 ,它将为您sorting项目:

 >>> from collections import Counter >>> x = Counter({'a':5, 'b':3, 'c':7}) >>> x.most_common() [('c', 7), ('a', 5), ('b', 3)] 

它会尽可能以最有效的方式进行。 如果你要求一个Top N而不是所有的值,则使用heapq而不是直接sorting:

 >>> x.most_common(1) [('c', 7)] 

在柜台之外,分类总是可以根据keyfunction进行调整; .sort()sorted()都是可调用的,可以指定一个值来对input序列进行sorting; sorted(x, key=x.get, reverse=True)会给你与x.most_common()相同的sorting,但只返回键,例如:

 >>> sorted(x, key=x.get, reverse=True) ['c', 'a', 'b'] 

或者只能对给定的值(key, value)进行sorting:

 >>> sorted(x.items(), key=lambda pair: pair[1], reverse=True) [('c', 7), ('a', 5), ('b', 3)] 

请参阅Pythonsortinghowto以获取更多信息。

是:

 >>> from collections import Counter >>> x = Counter({'a':5, 'b':3, 'c':7}) 

使用sorting的关键字键和lambda函数:

 >>> sorted(x.items(), key=lambda i: i[1]) [('b', 3), ('a', 5), ('c', 7)] >>> sorted(x.items(), key=lambda i: i[1], reverse=True) [('c', 7), ('a', 5), ('b', 3)] 

这适用于所有字典。 然而Counter有一个特殊的function已经给你的sorting项目(从最频繁,最不频繁)。 它被称为most_common()

 >>> x.most_common() [('c', 7), ('a', 5), ('b', 3)] >>> list(reversed(x.most_common())) # in order of least to most [('b', 3), ('a', 5), ('c', 7)] 

您还可以指定要查看的项目数量:

 >>> x.most_common(2) # specify number you want [('c', 7), ('a', 5)] 

@MartijnPieters的答案相当不错,除了Collections.most_common只返回一个元组以外, 还可以找回按字母sorting的字典 。 我经常把这个与一个json输出结合起来,用于方便的日志文件:

 from collections import Counter, OrderedDict x = Counter({'a':5, 'b':3, 'c':7}) y = OrderedDict(x.most_common()) 

输出:

 OrderedDict([('c', 7), ('a', 5), ('b', 3)]) { "c": 7, "a": 5, "b": 3 }