파이썬에서 dict는 꽤 많이 사용합니다. 키에 대응되는 값을 찾고 싶습니다. 어떻게 하면 좋을까요? 이번 시간에는 dictionary를 index로 접근하는 방법과 get 메서드로 접근하는 것의 차이점을 알아보겠습니다. 그리고 키가 없을 때 get 함수를 이용해서 어떻게 디폴트 값을 얻는지도 알아봅니다.
먼저 딕셔너리 d에는 키 값이 1이고 값이 1인 쌍과 키 값이 2이고 값이 2인 쌍 2개가 저장되어 있습니다. d[1]은 키 값이 1인 것의 value 값을 뽑아내는 것입니다.
1이 나오네요. 이건 당연합니다. 그러면, 이 경우는 어떨까요? 3이라는 키는 없으니까 딕셔너리에서 3을 꺼내와 봅시다.
해당 코드는 위와 같이 작성할 수 있습니다.
그랬더니 KeyError 에러가 납니다. 이는 3이라는 키가 없었기 때문입니다. 그러면, 이렇게 하면 어떨까요?
이번에는 3이 딕셔너리 d에 있는지를 검사하고 있으면 키 3이라는 것에 대응되는 값을 출력합니다. 없으면 아무 일도 수행하지 않습니다.
그러면, 의도한 대로 아무 것도 출력이 되지 않고, 오류 없이 끝남을 볼 수 있습니다. in으로 검사하고 있으면 출력하고 없으면 종료하는 아이디어는 나쁘지 않습니다. 그런데, 코드가 불필요하게 길어집니다. 자바에서도 키가 없을 때 디폴트 값을 출력해야 하는 경우가 종종 있는데요. 이 때 getOrDefault 메서드를 자주 사용하게 됩니다.
파이썬에는 이와 비슷한 것이 없을까요? 사실 없을 리가 없습니다. get 함수가 있습니다.
키 값 3을 뽑아오려고 합니다. 아까와는 다르게 d.get(3)을 썼습니다. 결과는 어떻게 나올까요?
None이 나옵니다. KeyError가 뜨지 않습니다. 그런데, 우리는 키가 없는 경우 특정한 값을 리턴해야 하는 처리를 생각보다 많이 하게 됩니다. 예를 들어, 이런 문제를 생각해 봅시다. 제가 서점에서 살 책 목록들이 n개 있습니다. 서점에는 서로 다른 m 종류의 책이 있습니다. 제가 살 책들은 모두 다른 이름을 가지고 있습니다. 만약에 서점에 책이 없다면 다음에 살 겁니다. 제가 서점에 책을 사러 갈 때 얼마를 써야 할까요? 이런 것을 어떻게 구현하면 좋을까요?
book_store에 있는 "a", "k", "h"라는 책의 가격이 1000, 2000, 1000 입니다. 다음에, 제가 살 책은 "a", "m", "ra", "k" 이렇게 4개입니다. 문제의 요구 사항에 따라 구현한다면, 위와 같이 구현할 수 있을 겁니다. 여기서 문제. 값이 제대로 나올까요? get 같은 경우, 키가 없을 때 default 값이 설정되지 않은 경우 None을 리턴합니다.
그런데 int와 None은 더할 수 없습니다. 그러면 어떻게 해야 할까요? 사실, 서점에 없는 책은 구입할 필요가 없으니, 키가 없을 때 리턴할 default value를 설정하면 됩니다. 이는 2번째 인자에서 설정할 수 있습니다. 문서에도 default 값에 대한 것이 언급되어 있습니다.
아까 코드와 달라진 점은 get 부분입니다. 2번째 인자에 0이 들어갔는데요. 이는 키가 없을 때 0을 리턴하라는 의미입니다. 결과는 어떻게 나올까요? "m"과 "ra"는 없는 책이므로, default 값인 0이 나오고, "a"와 "k"는 각각 1000, 2000입니다. 따라서, 리스트 컴프리헨션을 한 리스트에는 [1000, 0, 0, 2000]이 저장됩니다. 그리고, 이것이 sum 인자에 넘어갔으므로, 3000이 나오게 됩니다.
요구 사항을 어렵지 않게 구현할 수 있습니다.
'코딩 > 파이선' 카테고리의 다른 글
파이썬에서 os.environ이 무엇을 담고 있는지 알아봅시다. (0) | 2022.05.19 |
---|---|
파이썬 sys.path는 어떤 데이터를 저장하고 있을까요? (2) | 2022.05.05 |
python set 교집합 차집합 합집합 대칭 차집합을 구해 봅시다. (0) | 2022.04.13 |
xml.etree.elementtree의 iter 함수를 이용해서 태그에 있는 값을 뽑아봅시다. (0) | 2022.01.26 |
python itertools에 있는 product permutations combinations 함수를 알아봅시다. (0) | 2021.12.18 |
최근댓글