2018년 3월 20일 화요일

딕셔너리 소팅하기

파이썬 딕셔너리 소팅하기

[질문]

  dict에서 키가 아닌 값으로 소팅하고 싶습니다 DB에서 2개 필드(string value, numeric value 하나씩)를 읽어 dictionary x = {'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() 메소드는 쓸 수 없습니다.

람다 표현식 (Lambda expression)

람다 표현식(Lambda expression)  람다 표현식으로 함수를 정의하고, 이를 변수에 할당하여 변수를 함수처럼 사용한다. (1) 람다 표현식       lambda <매개변수> : 수식      ※ 람다식을 실행하...