파이썬

[python] 값으로 사전을 어떻게 정렬합니까?

zooheon 2022. 8. 21. 22:57
반응형

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

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

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

 

파이썬 3.7 이상 또는 CPython 3.6

Dict는 Python 3.7 이상에서 삽입 순서를 유지합니다. CPython 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}

또는

>>> dict(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에서는 압축 풀기가 허용되지 않으므로 사용할 수 있습니다 .

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

출력을 dict로 원하면 다음을 사용할 수 있습니다 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)]

 

반응형