카운터를 값으로 정렬하는 방법? -파이썬


145

역 목록 이해의 목록 이해를 수행하는 것 외에, 카운터를 값으로 정렬하는 pythonic 방법이 있습니까? 그렇다면 다음보다 빠릅니다.

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

답변:


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

가능한 가장 효율적인 방식으로 수행합니다. 모든 값 대신 Top N을 요청하면 a heapq가 직선 정렬 대신 사용됩니다.

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

정렬 된 키워드 키와 람다 함수 사용 :

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

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키워드는 정렬 방법을 정의하고, 마이너스 수치 형식 앞에 내려 나타냅니다
알렉스 심에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.