[python] 어떻게 값순으로 사전을 정렬합니까?


Answers

다음과 같이 간단합니다 : sorted(dict1, key=dict1.get)

글쎄, 실제로 "사전 값으로 정렬"을 수행 할 수 있습니다. 최근 나는 코드 골프 (스택 오버 플로우 질문 코드 골프 : 단어 빈도 차트 )에서 그렇게해야했습니다. Abridged, 문제는 종류의 것이었다 : 주어진 텍스트, 각 단어가 얼마나 자주 발생하는지 계산하고, 감소하는 빈도로 분류 된 상위 단어 목록을 표시한다.

단어를 키로 사용하고 각 단어의 출현 횟수를 값으로 사용하여 사전을 구성하면 다음과 같이 단순화됩니다.

from collections import defaultdict
d = defaultdict(int)
for w in text.split():
  d[w] += 1

sorted(d, key=d.get) 와 함께 사용 빈도 sorted(d, key=d.get) 으로 sorted(d, key=d.get) 단어 목록을 얻을 수 있습니다. 정렬은 단어 발생 수를 정렬 키로 사용하여 사전 키를 반복합니다.

for w in sorted(d, key=d.get, reverse=True):
  print w, d[w]

저는 사람들이 "키로 사전을 쉽게 분류 할 수는 있지만, 가치에 따라 분류하는 방법"을 설명하기 위해이 상세한 설명을 쓰고 있습니다. OP가 그러한 문제를 해결하려고 시도했다고 생각합니다. 그리고 위의 그림과 같이 값을 기준으로 키 목록을 정렬하는 방법이 있습니다.

Question

문자열 필드와 숫자 필드 : 데이터베이스의 두 필드에서 읽은 값의 사전 있습니다. 문자열 필드는 고유하므로 사전의 키입니다.

키를 정렬 할 수는 있지만 값을 기준으로 정렬 할 수 있습니까?

참고 : 스택 오버플로 질문을 읽었습니다. 사전 목록을 Python으로 정렬하려면 어떻게합니까? 아마도 사전 목록을 갖기 위해 내 코드를 변경할 수는 있지만 사전 목록이 필요 없기 때문에 간단한 해결책이 있는지 알고 싶었습니다.




값이 숫자 인 경우 컬렉션에서 카운터를 사용할 수도 있습니다.

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)

한 가지 방법은 labmda 함수를 사용하는 것입니다.

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



다음은 d.values()d.keys() 에서 zip을 사용하는 솔루션입니다. 사전보기 객체의이 링크 아래 몇 줄은 다음과 같습니다.

이렇게하면 zip () : pairs = 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')]



나는 이걸 생각해 냈다.

import operator    
x = {1: 2, 3: 4, 4:3, 2:1, 0:0}
sorted_x = {k[0]:k[1] for k in sorted(x.items(), key=operator.itemgetter(1))}

파이썬 3.x의 경우 : x.items() 대체하는 x.items() iteritems() .

>>> sorted_x
{0: 0, 1: 2, 2: 1, 3: 4, 4: 3}

또는 collections.OrderedDict 시도하십시오!

x = {1: 2, 3: 4, 4:3, 2:1, 0:0}
from collections import OrderedDict

od1 = OrderedDict(sorted(x.items(), key=lambda t: t[1]))



물론, 규칙적인 파이썬 사전은 원래 순서를 유지하지 않기 때문에 OrderedDict 를 사용해야합니다.

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

파이썬 2.7이나 그 이상이 없다면, 당신이 할 수있는 가장 좋은 방법은 생성기 함수의 값을 반복하는 것입니다. (여기에는 2.4 및 2.6에 대한 OrderedDict가 있지만

a) I don't know about how well it works 

b) You have to download and install it of course. If you do not have administrative access, then I'm afraid the option's out.)
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 이상을 사용하지 않는 경우 인쇄 후 괄호를 제거하십시오.




당신은 collections.Counter 를 사용할 수 있습니다. 숫자 및 비 숫자 값 모두에 대해 작동합니다.

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



Dicts는 정렬 될 수 없지만, Dicts에서 정렬 된 목록을 작성할 수 있습니다.

dict 값의 정렬 된 목록 :

sorted(d.values())

값으로 정렬 된 (키, 값) 쌍의 목록입니다.

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



사전에서 가장 높은 값에서 가장 낮은 값 순으로 정렬 된 키 - 값 쌍의 목록을 반환합니다.

sorted(d.items(), key=lambda x: x[1], reverse=True)

키별로 정렬 된 사전의 경우 다음을 사용하십시오.

sorted(d.items(), reverse=True)

사전 자체는 정렬 할 수 없기 때문에 반환은 튜플 목록입니다.

이것은 인쇄되거나 추가 계산으로 보내질 수 있습니다.




왜이 방법을 시도해보십시오. 다음 데이터로 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



업데이트 : 2015 년 12 월 5 일 Python 3.5 사용

허용 된 대답이 유용하다는 것을 OrderedDict , 표준 라이브러리 컬렉션 모듈에서 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 의 공식 문서는 비슷한 기능을 제공하지만 sort 함수에 람다 (lambda)를 사용합니다.

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



값이 정수이고 Python 2.7 이상을 사용하는 경우 dict 대신 collections.Counter 를 사용할 수 있습니다. most_common 메소드는 값으로 정렬 된 모든 항목을 제공합니다.




파이썬 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

즐겨 ;-)




주어진 사전

e = {1:39, 4:34, 7:110, 2:87}

정렬

sred = sorted(e.items(), key=lambda value: value[1])

결과

[(4, 34), (1, 39), (2, 87), (7, 110)]

람다 함수를 사용하여 값으로 항목을 정렬하고 변수 내에서 처리 할 수 ​​있습니다.이 경우 sred 는 원본 사전을 사용합니다.

희망이 도움이됩니다!




행크 게이의 대답과 거의 같습니다.


    sorted([(value,key) for (key,value) in mydict.items()])

또는 John Fouhy가 제안한대로 비트를 최적화했습니다.


    sorted((value,key) for (key,value) in mydict.items())




Related