개발자 블로그

[윤성우의 열혈 파이썬 중급편] - 9. dict & defaultdict & OrderedDict 본문

파이썬/윤성우의 열혈 파이썬 중급편

[윤성우의 열혈 파이썬 중급편] - 9. dict & defaultdict & OrderedDict

hayongwoon 2022. 4. 29. 16:18

우연치 않게 오늘 알고리즘 문제를 풀다가 딕셔너리로 접근하여 푸는 문제를 만났다. 그래서 더욱 반갑기도 했지만, 막상 문제에 적용하려 하니 잘 안되기도 했다. 역시 많이 접해보고 사용해봐야 익숙해질 것 같다. 그래서 따로 블로그를 통해 위 내용에 대해 더 자세하게 작성해보려한다!

 

1) 키가 존재할 때와 존재하지 않을 때

키가 존재할 때와 하지 않을 때, 대입의 연산(=)의 경우에는 예외 없이 잘 값의 수정 또는 생성으로 잘 이어진다. 하지만 문제는 참조(ex. +=)를 하고 싶을 때 일어난다. 

예를 들어 해당 키가 존재하지 않는 상황에서 값을 참조하려고 할 때, 예외가 발생한다. 예시를 들어보자!

이러한 경우 if와 else로 키가 존재할 때와 존재하지 않을 때 구분하여 처리할 수 있다. 하지만 더 나은 두가지 방법을 제시해보겠다!

 

1-1 첫 번째 방법) setdefault 메소드

setdefault 메소드

d.setdefault(k, v)           # 매개변수 k에는 키, v에는 디폴트 값 전달

  • k에 해당하는 키가 있을 때, 그 키의 값을 그대로 반환
  • k에 해당하는 키가 없을 때, 딕셔너리 k:v 를 저장하고 v를 반환

d[k] = d.setdefault(k, 0) + 1       

 

1) 연산이 들어가기 전에 먼저 setdefault 연산이 이루어짐.

2) 이어서 덧셈과 대입의 연산이 이루어진다!

 

 

1-2 두 번째 방법) defaultdict

디폴트 값을 갖는 딕셔너리를 생성하는 방법이다! from collections import defaultdict를 먼저 선언하고 사용해야한다. 아주 유용한 방법이라 기억해두면 좋다!

특이한건 defaultdict() 의 매개변수는 함수가 들어간다는 것이다. 그래서 복잡한 알고리즘을 함수와 엮어 더 쉽게 구현이 가능하다.

매개변수로 함수가 들어가는 것은 그 함수가 반환하는 값이 디폴트 값으로 연결이 된다! 예를 들어 만약 찾는 키가 없으면 예외처리를 하는 것이 아니라 미리 등록해 놓은 함수가 반환하는 값을 디폴트로 value 값으로 저장이 된다는 말! 

defaultdict 사용 예시

참고로 int 함수는 값이 없을 때 0을 반환한다. int() -> 0을 반환!

그리고 람다식이 들어갈 수도 있고, 여러가지 함수를 사용할 수 있다! 단 기억해야할 것은,  그 함수가 반환하는 값이 defaultidict의 해당 key의 value값으로 들어간다는 것!

 

참고로 알고리즘 카테고리에서 '프로그래머스 신고결과받기' 문제에서 defaultdict를 사용하여 문제를 풀었는데, 사용 예시로 적절할 수도 있으니 참고하면 좋겠다.

 

 

2) OderedDict

이번 블로깅에서 마지막으로 소개할 딕트는 ordereddict인데 사실 저번에 딕셔너리 편에서 잠깐 얘기한 바가 있지만, dict의 경우 저장을 할 때 순서를 고려하지는 않는다. 그래서 그 보완제로 ordereddict가 있는 것이다. 하지만, 파이썬 3.7부터는 딕트의 저장값의 순서를 유지하기 시작했다. 그럼에도 우리가 ordereddict를 알아야하는 이유에 대해 말해보겠다.

 

dict의 경우 순서를 고려하지 않고 값만 비교를 한다! 하지만, odereddict는 값과 순서를 함께 비교!

이렇듯 값뿐만 아니라 순서까지 고려해야할 상황이라면 OrderedDict를 사용해야함을 기억하자! 추가로 이 객체는 값의 순서를 맨처음과 맨끝으로 이동을 할수도 있다. 객체.move_to_end(key, last=True or False)를 사용하여!

따라서 저장 순서 자체가 하나의 정보로서 의미를 갖는다면, 그리고 저장 순서를 바꿔야 할 가능성도 존재한다면, OderedDict를 선택해야한다!