가치로 사전을 어떻게 분류합니까?
질문
데이터베이스의 두 필드에서 읽은 값의 사전 : 문자열 필드와 숫자 필드입니다.문자열 필드는 고유하므로 사전의 키입니다.
나는 키를 정렬 할 수 있지만 값을 기반으로 어떻게 정렬 할 수 있습니까?
참고 : 스택 오버플로 질문을 읽었습니다. 여기서 사전의 가치로 사전 목록을 정렬하려면 어떻게해야합니까?아마도 코드가 사전 목록을 변경할 수는 있지만 오름차순 또는 내림차순으로 정렬 할 수있는 더 간단한 해결책이 있는지 여부를 알고 싶었던 사전 목록이 실제로 필요하지 않습니다.
답변
파이썬 3.7+ 또는 CPYTHON 3.6.
Dicts는 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로 원한다면 컬렉션을 사용할 수 있습니다 .OrderedDict :
import collections
sorted_dict = collections.OrderedDict(sorted_x)
답변
단순한만큼 : 정렬 (dict1, key = dict1.get)
글쎄, 실제로 "사전 값별로 정렬"을 수행 할 수 있습니다.최근 코드 골프 (스택 오버플로 질문 코드 골프 : 단어 주파수 차트)에서 그렇게해야했습니다.요약 된 문제는 다음과 같습니다. 텍스트가 주어지면 각 단어가 얼마나 자주 발생하는지를 계산하고 주파수를 줄임으로써 정렬됩니다.
단어와 함께 단어와 각 단어의 발생 횟수를 가치로 구성하는 경우 여기에서 간단하게 만듭니다.
from collections import defaultdict
d = defaultdict(int)
for w in text.split():
d[w] += 1
그런 다음 정렬 된 (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)]
답변
Dicts는 정렬 할 수 없지만 정렬 된 목록을 빌드 할 수 있습니다.
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]))
정상적인 지도자는 정상적인 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)])
답변
업데이트 : 2015 년 12 월 5 일 파이썬 3.5를 사용하여
허용 된 답변을 유용하게 발견했지만, 표준 라이브러리 컬렉션 모듈의 명령문을 참조 할 수 없었습니다.
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)])
공식 주문문 문서는 매우 비슷한 예제를 제공하지만 정렬 기능을 위해 람다를 사용합니다.
# 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)])
출처:https://stackoverflow.com/questions/613183/how-do-i-sort-a-dictionary-by-value
최근댓글