source

사전을 값별로 정렬하려면 어떻게 해야 합니까?

lovecheck 2022. 11. 18. 21:31
반응형

사전을 값별로 정렬하려면 어떻게 해야 합니까?

데이터베이스에는 문자열 필드와 숫자 필드라는 두 개의 필드에서 읽은 값 사전이 있습니다.문자열 필드는 고유하기 때문에 사전의 키가 됩니다.

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

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

Python 3.7+ 또는 CPython 3.6

딕츠는 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}

구형 Python

사전은 정렬할 수 없고 정렬된 사전의 표현만 얻을 수 있습니다.사전은 본질적으로 순서가 없지만 목록이나 튜플과 같은 다른 유형은 순서가 없습니다.따라서 정렬된 값(아마도 튜플 목록)을 나타내려면 정렬된 데이터 유형이 필요합니다.

예를 들어.

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로 하는 경우는, 다음과 같이 사용할 수 있습니다.

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

그러면 단어 발생 횟수를 정렬 키로 사용하여 사전 키에서 반복 정렬된 단어 목록을 사용할 수 있습니다.

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에는 아이템이 추가된 순서를 기억하는 새로운 Order Dict 타입이 있습니다.

>>> 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]))

Ordered Dict는 일반적인 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일 Python 3.5 사용

받아들여진 답변이 유용하다고 느꼈지만, 이러한 문제를 해결하기 위해 설계된 실행 가능하고 현대적인 대안으로 표준 라이브러리 컬렉션 모듈의 OrderDict를 참조하도록 업데이트되지 않은 것에 대해서도 놀랐습니다.

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())

Python 3.6부터는 내장 dict가 주문됩니다.

좋은 소식입니다. 따라서 고유한 문자열 ID를 키로, 숫자 값을 값으로 데이터베이스에서 가져온 쌍을 내장 Python v3.6+ dict에 매핑하는 OP의 원래 사용 사례는 이제 삽입 순서를 따라야 합니다.

데이터베이스 쿼리에서 생성된 두 개의 열 테이블 식을 다음과 같이 말하는 경우:

SELECT a_key, a_value FROM a_table ORDER BY a_value;

두 개의 Python tuples, k_seq와 v_seq에 저장됩니다(숫자 인덱스에 따라 정렬되고 코스의 길이가 같음).

k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))

나중에 다음과 같이 출력 가능:

for k, v in ordered_map.items():
    print(k, v)

(새로운 Python 3.6+ 내장 dict!의 경우):

foo 0
bar 1
baz 42

v의 값당 동일한 순서로 표시됩니다.

현재 Python 3.5 설치 장소:

bar 1
foo 0
baz 42

세부사항:

2012년 Raymond Hettinger가 제안한 바와 같이 ("더 빠른 반복을 가진콤팩트한 사전"이라는 제목의 python-dev에 대한 참조 메일) 현재(2016년)는 27350Co의 수정/구현으로 인해 Victor Stinner가 python-dev에 보낸 메일에서 발표되었다.mpact and ordered dict"는 Python 3.6에서 삽입 순서를 유지하기 위해 내장된 dict를 사용할 수 있게 되었습니다.

첫 번째 단계로 Thin Layer OrderDict 구현이 이루어지길 바랍니다.@JimFasarakis-Hilliard가 지적한 바와 같이 OrderedDict 유형의 사용 사례는 향후에도 있을 것으로 예상됩니다.저는 Python 커뮤니티가 시간의 테스트를 견딜 수 있는지, 그리고 다음 단계가 무엇인지에 대해 주의 깊게 조사할 것이라고 생각합니다.

다음을 안정적으로 주문함으로써 열린 가능성을 놓치지 않기 위해 코딩 습관을 재고해야 할 때입니다.

  • 키워드 인수 및
  • (증명서) dict 스토리지

첫 번째는 경우에 따라 기능 및 메서드의 구현에서 디스패치를 용이하게 하기 때문입니다.

는 더 사용할 수 입니다.dicts는 처리 파이프라인의 중간 저장소로 사용됩니다.

Raymond Hettinger는 친절하게도 San Francisco Python Meetup Group 프레젠테이션 2016-DEC-08에서 "The Tech Behind Python 3.6 Dictionaries"를 설명하는 문서를 제공했습니다.

또한 많은 스택 오버플로우에서 장식된 질문과 답변 페이지에는 이 정보의 다양한 종류가 제공되며 많은 고품질 답변도 버전별로 업데이트해야 합니다.

경고 비우기(단, 아래 업데이트 2017-12-15 참조):

@ajcr이 적절하게 지적했듯이: "이 새로운 구현의 질서유지 측면은 구현 세부사항으로 간주되며 신뢰할 수 없습니다." (whatsnew36)는 nit picking이 아니라 인용이 다소 비관적입니다;-."로 계속된다. (이것은 미래에 바뀔 수 있지만, 현재와 미래의 모든 Python 구현에 대해 순서 유지 시멘틱스를 의무화하도록 언어 사양을 변경하기 전에 몇 가지 릴리스에서 이 새로운 dict 구현을 사용하는 것이 바람직하다.또한 이는 이전 버전의 언어와의 하위 호환성을 유지하는 데 도움이 된다.여기서 랜덤 반복 순서는 여전히 유효합니다(예: Python 3.5).

그래서 일부 인간의 언어(예: 독일어)에서와 같이, 관습이 언어를 형성하고, 이제 의지가 선언되었습니다.whatnew36에서.

2017-12-15 업데이트:

python-dev 목록에 보낸 메일에서 Guido van Rossum은 다음과 같이 선언했습니다.

그렇게 해 주세요.'독재가 삽입 명령을 지킨다'는 판결이 나왔다.감사합니다!

따라서 dict 삽입 순서의 버전 3.6 CPython 부작용은 언어 사양의 일부가 되고 있습니다(더 이상 구현 세부 사항뿐만이 아닙니다).또한 이 메일 스레드는 다음과 같은 중요한 설계 목표를 제시합니다.collections.OrderedDict레이먼드 헤팅거가 논의하는 동안 상기시켰던 것처럼요.

네임드 튜플을 사용하면 매우 편리할 수 있습니다.예를 들어, 'name'을 키로, 'score'를 값으로 사전이 있으며 'score'를 기준으로 정렬하려고 합니다.

import collections
Player = collections.namedtuple('Player', 'score name')
d = {'John':5, 'Alex':10, 'Richard': 7}

점수가 가장 낮은 정렬:

worst = sorted(Player(v,k) for (k,v) in d.items())

점수가 가장 높은 정렬:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)

이제 Pythonic적으로 두 번째로 뛰어난 플레이어(index=1)의 이름과 점수를 얻을 수 있습니다.

player = best[1]
player.name
    'Richard'
player.score
    7

저도 같은 문제가 있었는데 이렇게 해결했어요.

WantedOutput = sorted(MyDict, key=lambda x : MyDict[x]) 

("It's not sorting a dict"라고 대답한 사람들은 질문을 읽지 않았습니다!실제로, 「키를 기준으로 정렬할 수 있습니다만, 그 값에 근거해 어떻게 정렬할 수 있습니까」라고 하는 것은, 키의 리스트를 값의 값에 따라서 정렬하고 싶다고 하는 것을 의미합니다).

순서가 올바르게 정의되어 있지 않은 것에 주의해 주세요(같은 값의 키는 출력 리스트에서 임의의 순서로 표시됩니다).

값이 숫자인 경우 집합에서 사용할 수도 있습니다.

from collections import Counter

x = {'hello': 1, 'python': 5, 'world': 3}
c = Counter(x)
print(c.most_common())

>> [('python', 5), ('world', 3), ('hello', 1)]    

Python 2.7에서는 다음 작업을 수행합니다.

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

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

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

복사 복사: http://docs.python.org/dev/library/collections.html#ordereddict-examples-and-recipes

즐기세요;-)

코드는 다음과 같습니다.

import operator
origin_list = [
    {"name": "foo", "rank": 0, "rofl": 20000},
    {"name": "Silly", "rank": 15, "rofl": 1000},
    {"name": "Baa", "rank": 300, "rofl": 20},
    {"name": "Zoo", "rank": 10, "rofl": 200},
    {"name": "Penguin", "rank": -1, "rofl": 10000}
]
print ">> Original >>"
for foo in origin_list:
    print foo

print "\n>> Rofl sort >>"
for foo in sorted(origin_list, key=operator.itemgetter("rofl")):
    print foo

print "\n>> Rank sort >>"
for foo in sorted(origin_list, key=operator.itemgetter("rank")):
    print foo

결과는 다음과 같습니다.

원래의

{'name': 'foo', 'rank': 0, 'rofl': 20000}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Baa', 'rank': 300, 'rofl': 20}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Penguin', 'rank': -1, 'rofl': 10000}

바닥에서 뒹굴며 웃는다

{'name': 'Baa', 'rank': 300, 'rofl': 20}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Penguin', 'rank': -1, 'rofl': 10000}
{'name': 'foo', 'rank': 0, 'rofl': 20000}

순위

{'name': 'Penguin', 'rank': -1, 'rofl': 10000}
{'name': 'foo', 'rank': 0, 'rofl': 20000}
{'name': 'Zoo', 'rank': 10, 'rofl': 200}
{'name': 'Silly', 'rank': 15, 'rofl': 1000}
{'name': 'Baa', 'rank': 300, 'rofl': 20}

다음 방법을 시도해 보십시오.다음 데이터로 mydict라는 사전을 정의합니다.

mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

키를 기준으로 사전을 정렬하려면 다음과 같은 작업을 수행할 수 있습니다.

for key in sorted(mydict.iterkeys()):
    print "%s: %s" % (key, mydict[key])

그러면 다음 출력이 반환됩니다.

alan: 2
bob: 1
carl: 40
danny: 3

한편, 사전의 값을 기준으로 정렬하고 싶은 경우(질문에 나타난 바와 같이) 다음을 수행할 수 있습니다.

for key, value in sorted(mydict.iteritems(), key=lambda (k,v): (v,k)):
    print "%s: %s" % (key, value)

이 명령어(사전을 값에 따라 정렬)의 결과에서 다음 값이 반환됩니다.

bob: 1
alan: 2
danny: 3
carl: 40

.6 Python 3.6 ★dict이제 삽입 순서에 따라 객체가 정렬됩니다.Python 3.7 사 python python python python python python python python python python python python 。

>>> words = {"python": 2, "blah": 4, "alice": 3}
>>> dict(sorted(words.items(), key=lambda x: x[1]))
{'python': 2, 'alice': 3, 'blah': 4}

전에는 '우리'를 사용해야 요.OrderedDict.

Python 3.7 문서에는 다음과 같이 기술되어 있습니다.

버전 3.7에서 변경됨: 사전 순서는 삽입 순서임을 보증합니다.이 동작은 3.6부터의 CPython 구현 상세입니다.

또한 "반전된 색인"을 만들 수 있습니다.

from collections import defaultdict
inverse= defaultdict( list )
for k, v in originalDict.items():
    inverse[v].append( k )

이제 역순으로 값이 지정됩니다. 각 값에는 적용 가능한 키 목록이 있습니다.

for k in sorted(inverse):
    print k, inverse[k]

컬렉션을 사용할 수 있습니다.카운터이 값은 수치와 비수치 모두 사용할 수 있습니다.

>>> x = {1: 2, 3: 4, 4:3, 2:1, 0:0}
>>> from collections import Counter
>>> #To sort in reverse order
>>> Counter(x).most_common()
[(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)]
>>> #To sort in ascending order
>>> Counter(x).most_common()[::-1]
[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]
>>> #To get a dictionary sorted by values
>>> from collections import OrderedDict
>>> OrderedDict(Counter(x).most_common()[::-1])
OrderedDict([(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)])

값별로 영구적으로 정렬된 사전인 skip dict를 사용할 수 있습니다.

>>> data = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
>>> SkipDict(data)
{0: 0.0, 2: 1.0, 1: 2.0, 4: 3.0, 3: 4.0}

「 」를 사용하고 keys(),values() ★★★★★★★★★★★★★★★★★」items()값별로 정렬된 순서로 반복합니다.

스킵 리스트 데이터 구조를 사용하여 구현됩니다.

사전의 경우 매우 중요한 키와 값 사이의 연결을 유지하기 때문에 다른 답변에서 언급된 수집 솔루션은 절대적으로 우수합니다.

나는 다른 대답에 제시된 1번 선택지에 동의하지 않는다. 왜냐하면 그것은 키를 버리기 때문이다.

저는 위의 솔루션(아래 코드)을 사용하여 키와 값 모두에 대한 액세스를 유지했습니다.저 같은 경우에는 값에 따라 순서가 매겨졌지만 중요한 것은 값을 매긴 후 키를 매기는 것이었습니다.

from collections import Counter

x = {'hello':1, 'python':5, 'world':3}
c=Counter(x)
print( c.most_common() )


>> [('python', 5), ('world', 3), ('hello', 1)]

키에 전달할 수 있는 커스텀 기능을 사용할 수도 있습니다.

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

아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, OrderedDict왜냐하면 일반 Python 사전은 원래 순서를 유지하지 않기 때문입니다.

from collections import OrderedDict
a = OrderedDict(sorted(originalDict.items(), key=lambda x: x[1]))

Python 2.있습니다.OrderedDict여기에서는 2.4와 2.6에 대응하고 있습니다만,

a) 얼마나 잘 동작하는지 모른다.

그리고.

b) 물론 다운로드하여 설치해야 합니다.관리자 권한이 없는 경우 옵션은 사용할 수 없습니다.)


def gen(originalDict):
    for x, y in sorted(zip(originalDict.keys(), originalDict.values()), key=lambda z: z[1]):
        yield (x, y)
    #Yields as a tuple with (key, value). You can iterate with conditional clauses to get what you want. 

for bleh, meh in gen(myDict):
    if bleh == "foo":
        print(myDict[bleh])

또한 모든 값을 인쇄할 수 있습니다.

for bleh, meh in gen(myDict):
    print(bleh, meh)

Python 3.0 이상을 사용하지 않을 경우 인쇄 후 괄호를 삭제하십시오.

from django.utils.datastructures import SortedDict

def sortedDictByKey(self,data):
    """Sorted dictionary order by key"""
    sortedDict = SortedDict()
    if data:
        if isinstance(data, dict):
            sortedKey = sorted(data.keys())
            for k in sortedKey:
                sortedDict[k] = data[k]
    return sortedDict

zip on 및 을 사용하는 솔루션은 다음과 같습니다.이 링크 아래 (Dictionary view오브젝트)에는 다음과 같은 행이 있습니다.

이를 통해 zip()을 사용하여 (값, 키) 쌍을 생성할 수 있습니다. 쌍 = zip(d.values) d.keys().

이를 통해 다음 작업을 수행할 수 있습니다.

d = {'key1': 874.7, 'key2': 5, 'key3': 8.1}

d_sorted = sorted(zip(d.values(), d.keys()))

print d_sorted 
# prints: [(5, 'key2'), (8.1, 'key3'), (874.7, 'key1')]

Delettant가 지적한 바와 같이 Python 3.6은 이제 질서를 유지입니다!반복 가능한 항목(태플, 목록, 딕트)을 쉽게 분류할 수 있는 기능을 공유하려고 합니다.후자의 경우 키 또는 값을 기준으로 정렬할 수 있으며 숫자 비교를 고려할 수 있습니다.>= 3.6에만 해당!

예를 들어 문자열과 int를 유지하는 반복가능에서 sorted를 사용하려고 하면 sorted()는 실패합니다.물론 str()과의 문자열 비교를 강제할 수 있습니다.단, 실제 수치 비교를 하고 싶은 경우가 있습니다.12보다 작다20(이것은 문자열 비교에서는 해당되지 않습니다).그래서 저는 다음과 같이 생각했습니다.명시적 숫자 비교를 원하는 경우 플래그를 사용할 수 있습니다.num_as_num모든 값을 부동으로 변환하여 명시적인 숫자 정렬을 시도합니다.성공하면 숫자 정렬이 수행되고 그렇지 않으면 문자열 비교에 의존합니다.

개선을 위한 코멘트입니다.

def sort_iterable(iterable, sort_on=None, reverse=False, num_as_num=False):
    def _sort(i):
      # sort by 0 = keys, 1 values, None for lists and tuples
      try:
        if num_as_num:
          if i is None:
            _sorted = sorted(iterable, key=lambda v: float(v), reverse=reverse)
          else:
            _sorted = dict(sorted(iterable.items(), key=lambda v: float(v[i]), reverse=reverse))
        else:
          raise TypeError
      except (TypeError, ValueError):
        if i is None:
          _sorted = sorted(iterable, key=lambda v: str(v), reverse=reverse)
        else:
          _sorted = dict(sorted(iterable.items(), key=lambda v: str(v[i]), reverse=reverse))
      
      return _sorted
      
    if isinstance(iterable, list):
      sorted_list = _sort(None)
      return sorted_list
    elif isinstance(iterable, tuple):
      sorted_list = tuple(_sort(None))
      return sorted_list
    elif isinstance(iterable, dict):
      if sort_on == 'keys':
        sorted_dict = _sort(0)
        return sorted_dict
      elif sort_on == 'values':
        sorted_dict = _sort(1)
        return sorted_dict
      elif sort_on is not None:
        raise ValueError(f"Unexpected value {sort_on} for sort_on. When sorting a dict, use key or values")
    else:
      raise TypeError(f"Unexpected type {type(iterable)} for iterable. Expected a list, tuple, or dict")

Python for Everyone에서 관련 기술을 배웠어요.

사전 정렬에 도움이 되는 임시 목록을 사용할 수 있습니다.

#Assume dictionary to be:
d = {'apple': 500.1, 'banana': 1500.2, 'orange': 1.0, 'pineapple': 789.0}

# create a temporary list
tmp = []

# iterate through the dictionary and append each tuple into the temporary list 
for key, value in d.items():
    tmptuple = (value, key)
    tmp.append(tmptuple)

# sort the list in ascending order
tmp = sorted(tmp)

print (tmp)

목록을 내림차순으로 정렬하려면 원래 정렬 줄을 다음과 같이 변경하십시오.

tmp = sorted(tmp, reverse=True)

목록 이해를 사용하면 하나의 라이너는 다음과 같습니다.

#Assuming the dictionary looks like
d = {'apple': 500.1, 'banana': 1500.2, 'orange': 1.0, 'pineapple': 789.0}
#One liner for sorting in ascending order
print (sorted([(v, k) for k, v in d.items()]))
#One liner for sorting in descending order
print (sorted([(v, k) for k, v in d.items()], reverse=True))

출력 예:

#Asending order
[(1.0, 'orange'), (500.1, 'apple'), (789.0, 'pineapple'), (1500.2, 'banana')]
#Descending order
[(1500.2, 'banana'), (789.0, 'pineapple'), (500.1, 'apple'), (1.0, 'orange')]

dicts에서 ValueSortedDict 사용:

from dicts.sorteddict import ValueSortedDict
d = {1: 2, 3: 4, 4:3, 2:1, 0:0}
sorted_dict = ValueSortedDict(d)
print sorted_dict.items() 

[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]

dict를 반복하고 값을 기준으로 내림차순으로 정렬합니다.

$ python --version
Python 3.2.2

$ cat sort_dict_by_val_desc.py 
dictionary = dict(siis = 1, sana = 2, joka = 3, tuli = 4, aina = 5)
for word in sorted(dictionary, key=dictionary.get, reverse=True):
  print(word, dictionary[word])

$ python sort_dict_by_val_desc.py 
aina 5
tuli 4
joka 3
sana 2
siis 1

값이 정수이고 Python 2.7 이후를 사용하는 경우,dict.그most_commonmethod는 모든 항목을 값별로 정렬하여 제공합니다.

이것은 3.1.x 로 동작합니다.

import operator
slovar_sorted=sorted(slovar.items(), key=operator.itemgetter(1), reverse=True)
print(slovar_sorted)

완성도를 높이기 위해 hipq를 사용하여 솔루션을 게시합니다.이 방법은 숫자 값과 숫자 이외의 값 모두에 적용됩니다.

>>> x = {1: 2, 3: 4, 4:3, 2:1, 0:0}
>>> x_items = x.items()
>>> heapq.heapify(x_items)
>>> #To sort in reverse order
>>> heapq.nlargest(len(x_items),x_items, operator.itemgetter(1))
[(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)]
>>> #To sort in ascending order
>>> heapq.nsmallest(len(x_items),x_items, operator.itemgetter(1))
[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]

언급URL : https://stackoverflow.com/questions/613183/how-do-i-sort-a-dictionary-by-value

반응형