如何按值对Counter排序?-蟒蛇


144

除了执行反向列表理解的列表理解之外,还有一种Python方式可以按值对Counter进行排序吗?如果是这样,它比这更快:

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

Answers:


251

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

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

它将以最有效的方式进行;如果您要求前N个而不是所有值,heapq则使用a代替直接排序:

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

在计数器外部,可以始终根据key功能调整排序;.sort()sorted()都接受赎回,让您指定要排序的输入序列的值; sorted(x, key=x.get, reverse=True)将为您提供与相同的排序x.most_common(),但仅返回键,例如:

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

或者您可以仅对给定的值(key, value)对进行排序:

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

有关更多信息,请参见Python排序方法


30

@MartijnPieters答案的一个相当不错的补充是,由于仅返回一个元组,因此可以按出现的顺序返回字典Collections.most_common。我经常将它与方便的日志文件的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
}

10

是:

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

使用排序的关键字键和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具有特殊功能,可以为您提供已排序的项目(从最频繁到最不频繁)。叫做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)]

反向排序的另一种方法是将关键功能设置为lamda i: -i[1]
Steinar Lima 2014年

4

更一般的排序方式,其中key关键字定义排序方式,在数字类型表示降序之前减去:

>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> sorted(x.items(), key=lambda k: -k[1])  # Ascending
[('c', 7), ('a', 5), ('b', 3)]

2
key关键字定义的排序方法,减去数值类型之前指示降
亚历煤层
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.