일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 리눅스
- dynamic programming
- scala
- docker
- Java
- 프로그래머스
- 주키퍼
- Go언어
- 스칼라
- codewars
- Linux
- DP
- 튜토리얼
- go
- leetcode
- 문제풀이
- Python
- 코드워
- HBase
- redis
- boj
- programmers
- gradle
- 파이썬
- 자바
- 동적프로그래밍
- OOM
- golang
- 알고리즘
- zookeeper
- Today
- Total
파이문
파이썬에서 딕셔너리 키 값 체크하기 본문
파이썬에서 딕셔너리 키 값 체크하기
(Python dictionary key exist)
파이썬에서 딕셔너리 키 값을 체크할 때 has_key 혹은 get을 사용하는 경우가 있었는데, 이에 대해서 무엇이 다르고 어떤 것이 가이드 라인(Pythonic)인지 정리해보고자 한다.
기존에 파이썬에서 딕셔너리를 만들고 키 값이 있는지 없는지 판별하는 아주 간단한 함수를 작성하였다.
menu = {"ham" : 1, "cucumber" : -12, "egg" : 100}
if menu.has_key("ham"):
print "네, 찾는 것이 있네요"
else:
print "그런 메뉴는 없습니다."
정말 아무 이상 없을 것 같은 코드이고, 실제로 제대로 동작한다.
반대로 딕셔너리(메뉴)에 없는 키 값을 넣는다면 "그런 메뉴는 없습니다"를 출력한다.
그런데, 다 잘된다는데 AttributeError: 'dict' object has no attribute 'has_key' 이런 에러가 나는 분들이 있을 것이다.
장담하건데 그 분들은 모두 파이썬 3을 쓰시는 분들이실 것이다.
파이썬 3은 해당 함수가 존재하지 않기 때문이다! 왜냐하면 has_key 는 파이썬에서 지양하는 함수 이기 때문이다. 파이썬 2점 대를 쓰시는 분들도 쓰면 안된다. http://stackoverflow.com/questions/1323410/has-key-or-in
그렇다면 키가 있는지 없는지 체크하려면 무엇을 써야 할까?
여기엔 (내가 아는 것만) 세 가지 방법이 있다.
우선 원하는 것이 단순히 키 값이 존재하는지, 아님 키 값에 대응하는 Value가 갖고 싶은 건지 체크하는 것이 먼저이다.
첫 번째로 작성하였던 예제 코드에서 has_key는 boolean 값을 리턴한다. 값이 있는지, 없는지만 체크하는 것이다.
이 때 쓸 수 있는 방법은 두 가지가 있다.
바로 get과 in이다.
1. get
menu = {"ham" : 1, "cucumber" : -12, "egg" : 100}
if menu.get("ham"):
print "네, 찾는 것이 있네요"
else:
print "그런 메뉴는 없습니다."
menu = {"ham" : 1, "cucumber" : -12, "egg" : 100}
if "ham" in menu:
print "네, 찾는 것이 있네요"
else:
print "그런 메뉴는 없습니다."
파이썬에서 거짓(False)로 판별하는 것들이 몇 가지가 있는데, 0이나 빈 리스트, 빈 스트링, 빈 딕셔너리, 빈 튜플 등이다.
get은 키에 해당하는 값을 넘겨주기 때문에 값이 있다면 True고 없다면 False(...일 것 같지만 실제로는 None을 리턴한다. None은 False가 아니긴 하지만.... 어차피 키 값 판별이니 True가 아니므로 없는 메뉴에 대해서는 else로 빠진다.) 가 된다.
즉 get은 값을 넘겨주게 되고, 값이 있다면 파이썬에서는 True로 받아들인다.
두 번째, in의 경우엔 boolean값이 리턴되는데 값이 아니라 있는지, 없는지만 넘겨주게 된다.
그리고 마지막 방법이 하나 더 있는데 그것이 바로 키 값을 통해 직접 Value를 호출하는 것이다.
백마디말보다 코드 한 줄이 더 낫다.
menu = {"ham" : 1, "cucumber" : -12, "egg" : 100}
if menu["ham"]:
print "네, 찾는 것이 있네요"
else:
print "그런 메뉴는 없습니다."
기존에 C++이나 자바를 접했던 사람이라면 위 코드가 더 익숙하게 느껴지지 않을까? 아닐수도 있구.
암튼 위 코드 역시 get과 마찬가지로 Value를 리턴한다.
get과 다른 점이 있다면 없는 메뉴에 대해서 get은 None을 리턴하지만 아래의 마지막 코드는 에러를 내뱉게 된다.
따라서 "kimch"를 찾는다면 아래 코드는 KeyError : "kimch"를 내뱉을 것이다.
마지막으로,
사실 get은 get(키, None)과 같다.
그리고 키 값이 있다면 해당 Value를 리턴하고 없다면 새로 값을 넣어주고 싶을 때는 setdefault(키, 새로운 값) 으로 코드를 작성할 수도 있다. 쉽게 보자면 has_key는 쓰지 말고 (퍼포먼스로도 딸린다. O(1)일 것 같지만 실제로는 O(n)이다.) 키 값이 있는지만 보자면 in을 쓰고 값을 리턴하고 싶을 때는 get을 쓰자.
'Python > Python' 카테고리의 다른 글
파이썬 클래스 상속 (0) | 2017.01.16 |
---|---|
파이썬 얕은 복사와 깊은 복사 (0) | 2017.01.09 |
파이썬에서 switch-case문 사용하기 (0) | 2016.05.25 |
파이썬에서의 getter와 setter (0) | 2016.04.22 |
파이썬에서 문자열 합치기 (0) | 2016.04.10 |