How to sort Counter by value? - python
除了执行反向列表理解的列表理解之外,还有一种Python方式可以按值对Counter进行排序吗? 如果是这样,它比这更快:
1 2 3 4 5 6 7 8 9 10 | >>> 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) |
使用
1 2 3 4 | >>> from collections import Counter >>> x = Counter({'a':5, 'b':3, 'c':7}) >>> x.most_common() [('c', 7), ('a', 5), ('b', 3)] |
它将以最有效的方式进行;如果您要求前N个而不是所有值,则使用
1 2 | >>> x.most_common(1) [('c', 7)] |
在计数器之外,可以始终根据
1 2 | >>> sorted(x, key=x.get, reverse=True) ['c', 'a', 'b'] |
或者您可以仅对给定的
1 2 | >>> sorted(x.items(), key=lambda pair: pair[1], reverse=True) [('c', 7), ('a', 5), ('b', 3)] |
有关更多信息,请参见Python排序方法。
@MartijnPieters答案的一个相当不错的补充是,由于
1 2 3 4 | from collections import Counter, OrderedDict x = Counter({'a':5, 'b':3, 'c':7}) y = OrderedDict(x.most_common()) |
随着输出:
1 2 3 4 5 6 | OrderedDict([('c', 7), ('a', 5), ('b', 3)]) { "c": 7, "a": 5, "b": 3 } |
是:
1 2 | >>> from collections import Counter >>> x = Counter({'a':5, 'b':3, 'c':7}) |
使用排序的关键字键和lambda函数:
1 2 3 4 | >>> 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)] |
这适用于所有词典。但是
1 2 3 4 | >>> 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)] |
您还可以指定要查看的项目数:
1 2 | >>> x.most_common(2) # specify number you want [('c', 7), ('a', 5)] |
更一般的排序方式,其中
1 2 3 | >>> x = Counter({'a':5, 'b':3, 'c':7}) >>> sorted(x.items(), key=lambda k: -k[1]) # Ascending [('c', 7), ('a', 5), ('b', 3)] |