2009-03-23 3 views
14

나는 다음과 같은 사전을 가지고있다 : 값으로 정렬 된 Python 사전을 반복하는 방법은 무엇입니까?

을 반복하지 않고 키를 사용하고 싶다. 다른 말로하면 :

(b, 1) 
(c, 2) 
(a, 6) 

가장 쉬운 방법은 무엇입니까?

+0

http://stackoverflow.com/questions/613183/sort-a-dictionary-in-python-by-the-value –

+2

안 속는 사람을 복제. 다른 하나는 사전을 분류하기를 원하며 불가능합니다. 나는 정렬 된 순서로 사전을 반복하고 싶다. – mike

+0

이며 코드는 정확히 같습니다. – SilentGhost

답변

30
sorted(dictionary.items(), key=lambda x: x[1]) 

는 :-)

import operator 
sorted(dictionary.items(), key=operator.itemgetter(1)) 

그러나 operator 버전의 items 방법은 당신에게 (키, 값) 튜플의 목록을 제공 CPython의 2.5 +

+0

열쇠와 항목뿐 아니라 항목이 필요합니다. – mike

+0

dictionary.items()는 키뿐만 아니라 키와 값을 모두 제공합니다. –

+1

@Mike : 항목은 (키, 값) 쌍입니다. – vartec

3

필요 이는 sorted 및 맞춤 정렬 키를 사용하여 정렬 할 수 있습니다.

Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 

>>> a={ 'a': 6, 'b': 1, 'c': 2 } 
>>> sorted(a.items(), key=lambda (key,value): value) 
[('b', 1), ('c', 2), ('a', 6)] 

파이썬 3에서는 람다식이 lambda x: x[1]으로 변경되어야합니다.

+0

처음 세 줄을 제거하고 마지막 줄을 제거 할 수 있습니다 ... 지금 조금 바쁜 것 같습니다. –

+1

튜플 압축 풀기는 파이썬 3에서 더 이상 지원되지 않습니다 ... 불행히도. – Stephan202

+0

@Nikhil 헤더가 중요하다고 생각합니다. 특히 @ Stephan의 의견에 따르면 데모 용 버전은 중요합니다. –

7

비 파이썬 3 프로그램의 경우 iteritems를 사용하여 발전기의 성능을 향상 시키십시오. 생성기의 성능을 향상 시키려면 모든 iteritem을 한 번에 하나씩 반환하는 대신 한 번에 하나씩 값을 생성하십시오.

sorted(d.iteritems(), key=lambda x: x[1]) 

는 더 큰 사전을 위해, 우리는 한 단계 더 가서는 람다와 함께 지금처럼 대신 파이썬의 주요 기능 be in C을 가질 수 있습니다.

import operator 
sorted(d.iteritems(), key=operator.itemgetter(1)) 

만세!

+0

우. operator.itemgetter와 잘 어울립니다. 단. –

+0

테스트를 거치지는 않았지만 소모품 이터레이터에서 '정렬'이 목록보다 더 잘 수행된다는 주장에 회의적입니다. 나는'sorted '가 가장 먼저하는 일은 iterator를리스트로 읽는 것이라고 생각한다. 여기에 성능 향상이 있는지 여부는 매우 분명하지 않습니다. –

4

종종 매우 편리 할 수 ​​있습니다. namedtuple. 예를 들어, 이름의 사전을 가지고 점수 당신은 '점수'에 정렬 할 :

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

먼저 가장 높은 점수로 정렬 :

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

먼저 낮은 점수로 정렬

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

나열된 튜플에서 '키'와 '값'의 순서는 (값, 키)이지만 이제는 이름과 점수를 얻을 수 있습니다. 차선의 플레이어 (색인 = 1)가 매우 파이썬 적으로 like :

player = best[1] 
    player.name 
     'Richard' 
    player.score 
     7 
관련 문제