[python] Python 3은 값을 기준으로 dict를 정렬합니다.

내가 찾은 유일한 방법은 python2에서 작동하거나 튜플 목록 만 반환합니다.

{"aa": 3, "bb": 4, "cc": 2, "dd": 1}값을 기준으로 사전을 정렬 할 수 있습니까?

내가 달성하고자하는 정렬 된 사전의 순서는 가장 큰 것에서 가장 작은 것까지입니다. 결과가 다음과 같기를 바랍니다.

bb 4
aa 3
cc 2
dd 1

정렬 후 텍스트 파일에 저장하고 싶습니다.



답변

itemgetter(다른 답변 참조) 큰 사전에는 (내가 아는 바와 같이) 더 효율적이지만 일반적인 경우에는 그것이 이긴다고 생각합니다 d.get. 그리고 추가 import.

>>> d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
>>> for k in sorted(d, key=d.get, reverse=True):
...     k, d[k]
...
('bb', 4)
('aa', 3)
('cc', 2)
('dd', 1)

선택적으로 설정할 수있는 참고 d.__getitem__key위에 작은 성능 향상을 제공 할 수 있습니다 기능 d.get.


답변

from collections import OrderedDict
from operator import itemgetter

d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
print(OrderedDict(sorted(d.items(), key = itemgetter(1), reverse = True)))

인쇄물

OrderedDict([('bb', 4), ('aa', 3), ('cc', 2), ('dd', 1)])

마지막 문장에서 튜플 목록이 잘 작동하는 것처럼 보입니다.

from operator import itemgetter

d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
for key, value in sorted(d.items(), key = itemgetter(1), reverse = True):
    print(key, value)

어느 인쇄

bb 4
aa 3
cc 2
dd 1


답변

딕셔너리 이해를 사용하여 역순 (최대에서 최소) 으로 을 정렬 할 수 있습니다 .

{k: d[k] for k in sorted(d, key=d.get, reverse=True)}
# {'b': 4, 'a': 3, 'c': 2, 'd': 1}

을 오름차순 (가장 작은 것에서 가장 큰 것)으로 정렬하려는 경우

{k: d[k] for k in sorted(d, key=d.get)}
# {'d': 1, 'c': 2, 'a': 3, 'b': 4}

당신은별로 정렬하려면 키를 오름차순으로

{k: d[k] for k in sorted(d)}
# {'a': 3, 'b': 4, 'c': 2, 'd': 1}

이것은 사전이 삽입 순서를 유지하기 때문에 CPython 3.6+ 및 Python 3.7+의 모든 구현에서 작동합니다.


답변

또 다른 방법은 람다 식을 사용하는 것입니다. 인터프리터 버전과 정렬 된 사전 또는 정렬 된 키-값 튜플 (OP처럼)을 만들 것인지 여부에 따라 허용되는 답변보다 빠를 수도 있습니다.

d = {'aa': 3, 'bb': 4, 'cc': 2, 'dd': 1}
s = sorted(d.items(), key=lambda x: x[1], reverse=True)

for k, v in s:
    print(k, v)


답변

사전을 정렬하려면 연산자 모듈을 사용할 수 있습니다. 다음 은 운영자 모듈 문서입니다.

import operator                             #Importing operator module
dc =  {"aa": 3, "bb": 4, "cc": 2, "dd": 1}  #Dictionary to be sorted

dc_sort = sorted(dc.items(),key = operator.itemgetter(1),reverse = True)
print dc_sort

출력 순서는 정렬 된 목록이됩니다.

[('bb', 4), ('aa', 3), ('cc', 2), ('dd', 1)]

키와 관련하여 정렬하려면 다음을 사용할 수 있습니다.

dc_sort = sorted(dc.items(),key = operator.itemgetter(0),reverse = True)

출력 순서는 다음과 같습니다.

[('dd', 1), ('cc', 2), ('bb', 4), ('aa', 3)]


답변

사전을 정렬하고 나중에 사전으로 작동하도록 유지 하려면 표준 라이브러리에서 OrderedDict 를 사용할 수 있습니다 .

이것이 필요한 것이 아니라면 튜플 목록을 남기는 정렬 함수를 재고하는 것이 좋습니다. 순서가 지정된 키-값 쌍 (튜플) 목록이 아니라면 어떤 출력을 원했습니까?


답변