[python] 사전을 값별로 정렬하려면 어떻게합니까?

데이터베이스의 두 필드 인 문자열 필드와 숫자 필드에서 읽은 값 사전이 있습니다. 문자열 필드는 고유하므로 사전의 키입니다.

키를 기준으로 정렬 할 수 있지만 값을 기준으로 정렬하려면 어떻게해야합니까?

참고 : 스택 오버플로 질문을 읽었습니다 . 사전 값으로 사전 목록을 정렬하려면 어떻게합니까? 사전 목록을 갖도록 코드를 변경할 수는 있지만 실제로 사전 목록이 필요하지 않으므로 오름차순 또는 내림차순으로 정렬하는 더 간단한 솔루션이 있는지 알고 싶었습니다.



답변

파이썬 3.6 이상

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
{k: v for k, v in sorted(x.items(), key=lambda item: item[1])}
{0: 0, 2: 1, 1: 2, 4: 3, 3: 4}

오래된 파이썬

사전을 정렬 할 수 없으며 정렬 된 사전을 표시하기 만합니다. 사전은 본질적으로 순서가 없지만 목록 및 튜플과 같은 다른 유형은 그렇지 않습니다. 따라서 정렬 된 값을 나타내는 순서화 된 데이터 유형이 필요합니다. 목록은 아마도 튜플 목록 일 것입니다.

예를 들어

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(1))

sorted_x각 튜플의 두 번째 요소별로 정렬 된 튜플 목록이됩니다. dict(sorted_x) == x.

그리고 값 대신 키를 정렬하려는 사람들을 위해 :

import operator
x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(0))

압축 풀기가 허용되지 않으므로 Python3에서 [1] 사용할 수 있습니다

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=lambda kv: kv[1])

출력을 받아쓰기로하려면 다음을 사용할 수 있습니다 collections.OrderedDict.

import collections

sorted_dict = collections.OrderedDict(sorted_x)


답변

다음과 같이 간단합니다. sorted(dict1, key=dict1.get)

실제로 “사전 값으로 정렬”을 수행 할 수 있습니다. 최근 코드 골프 (스택 오버플로 질문 코드 골프 : 단어 빈도 차트 ) 에서 그렇게해야했습니다 . 요약하면, 문제는 일종의 문제입니다. 텍스트가 주어지면 각 단어가 얼마나 자주 나오는지 세고 가장 많이 나오는 단어 목록을 빈도를 기준으로 정렬하여 표시합니다.

단어를 키로 사용하고 각 단어의 발생 횟수를 값으로 사용하여 사전을 구성하는 경우 다음과 같이 단순화하십시오.

from collections import defaultdict
d = defaultdict(int)
for w in text.split():
    d[w] += 1

그런 다음 사용 빈도별로 정렬 된 단어 목록을 얻을 수 있습니다 sorted(d, key=d.get). 정렬은 단어 발생 횟수를 정렬 키로 사용하여 사전 키를 반복합니다.

for w in sorted(d, key=d.get, reverse=True):
    print(w, d[w])

나는 사람들이 종종 “키로 사전을 쉽게 정렬 할 수 있지만 어떻게 값으로 정렬 하는가”라는 의미를 설명하기 위해이 상세한 설명을 작성하고있다. 그리고 해결책은 위에 표시된 것처럼 값을 기반으로 일종의 키 목록을 수행하는 것입니다.


답변

당신은 사용할 수 있습니다 :

sorted(d.items(), key=lambda x: x[1])

사전에서 각 항목의 값을 최소에서 최대로 정렬하여 사전을 정렬합니다.

내림차순으로 정렬하려면 다음을 추가하십시오 reverse=True.

sorted(d.items(), key=lambda x: x[1], reverse=True)

입력:

d = {'one':1,'three':3,'five':5,'two':2,'four':4}
a = sorted(d.items(), key=lambda x: x[1])    
print(a)

산출:

[('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)]


답변

딕 트는 정렬 할 수 없지만 정렬 된 목록을 만들 수 있습니다.

정렬 된 dict 값 목록 :

sorted(d.values())

값별로 정렬 된 (키, 값) 쌍 목록 :

from operator import itemgetter
sorted(d.items(), key=itemgetter(1))


답변

최근 Python 2.7에는 새로운 OrderedDict 유형이 있으며, 항목이 추가 된 순서를 기억합니다.

>>> d = {"third": 3, "first": 1, "fourth": 4, "second": 2}

>>> for k, v in d.items():
...     print "%s: %s" % (k, v)
...
second: 2
fourth: 4
third: 3
first: 1

>>> d
{'second': 2, 'fourth': 4, 'third': 3, 'first': 1}

값을 기준으로 원본에서 새로운 순서 사전을 만들려면 :

>>> from collections import OrderedDict
>>> d_sorted_by_value = OrderedDict(sorted(d.items(), key=lambda x: x[1]))

OrderedDict는 일반적인 dict처럼 행동합니다 :

>>> for k, v in d_sorted_by_value.items():
...     print "%s: %s" % (k, v)
...
first: 1
second: 2
third: 3
fourth: 4

>>> d_sorted_by_value
OrderedDict([('first': 1), ('second': 2), ('third': 3), ('fourth': 4)])


답변

업데이트 : Python 3.5를 사용하는 2015 년 12 월 5 일

허용 된 답변이 유용하다는 것을 알았지 만 표준 라이브러리 컬렉션 모듈 의 OrderedDict 를 실행 가능한 현대 대안 으로 참조하도록 업데이트되지 않았다는 사실에 놀랐습니다 .이 유형의 문제를 정확하게 해결하도록 설계되었습니다.

from operator import itemgetter
from collections import OrderedDict

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = OrderedDict(sorted(x.items(), key=itemgetter(1)))
# OrderedDict([(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)])

공식 OrderedDict 문서도 매우 유사한 예제를 제공하지만 정렬 함수에 람다를 사용합니다.

# regular unsorted dictionary
d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

# dictionary sorted by value
OrderedDict(sorted(d.items(), key=lambda t: t[1]))
# OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])


답변

행크 게이의 답변 과 거의 같습니다.

sorted([(value,key) for (key,value) in mydict.items()])

또는 John Fouhy가 제안한대로 약간 최적화되었습니다.

sorted((value,key) for (key,value) in mydict.items())