파이썬 딕셔너리 소팅하기
[질문]
dict에서 키가 아닌 값으로 소팅하고 싶습니다 DB에서 2개 필드(string value, numeric value 하나씩)를 읽어 dictionaryx = {'1': 2, '3': 4, '4': 3, '2': 1, '0': 0}
를 만들었습니다. string은 유니크한 키이고 numeric은 그렇지 않습니다. string 기준으로는 소팅할 수 있는데 numeric으로는 소팅하는 방법을 모르겠어요. 어떻게 해야되나요?[답변]
dict는 리스트나 튜플이랑은 다르게 순서가 없습니다. 따라서 dict 타입은 소팅할 수 없기때문에, dict를 소팅하고 싶다면 dict를 튜플의 리스트로 표현해야 합니다.
예를들어. 키가 아닌 값으로 소팅 하고 싶다면
import operator
x = {'1': 2, '3': 4, '4': 3, '2': 1, '0': 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(1))
이 경우 sorted_x 는 2번째 요소를 기준으로 소팅된 튜플들의 리스트이고.
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))
출처: <http://hashcode.co.kr/questions/19/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC-%EC%86%8C%ED%8C%85%ED%95%98%EA%B8%B0>
dictionary의 items()와 iteritmes()의 차이점
dict.items() 와 dict.iteritems()는 파이썬 버전에 따라 다른 결과를 냅니다.
원래 파이썬
items()
는 tuple을 원소로 가지는 list
를 return 했습니다. 이 방법은 메모리가 많이 필요했기 때문에, generator가 도입된 후 메모리의 효율적 관리를 위해 items()
대신 iterator-generator 메소드인 iteritems()
를 쓰게 됩니다.
다만 2.x에서는 구버전과의 호환성을 위해서
items()
와 iteritems()
를 모두 지원했지만 python3에서는 iterm()
은 list가 아닌 iterator를 return하고(python3 의 items()
= python2의 iteritems()
) iteritems()
메소드는 쓸 수 없습니다.