如何按价值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)]
在柜台之外,分类总是可以根据key
function进行调整; .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 }