데이터베이스의 두 필드 인 문자열 필드와 숫자 필드에서 읽은 값 사전이 있습니다. 문자열 필드는 고유하므로 사전의 키입니다.
키를 기준으로 정렬 할 수 있지만 값을 기준으로 정렬하려면 어떻게해야합니까?
참고 : 스택 오버플로 질문을 읽었습니다 . 사전 값으로 사전 목록을 정렬하려면 어떻게합니까? 사전 목록을 갖도록 코드를 변경할 수는 있지만 실제로 사전 목록이 필요하지 않으므로 오름차순 또는 내림차순으로 정렬하는 더 간단한 솔루션이 있는지 알고 싶었습니다.
답변
파이썬 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())