파이문

파이썬에서 딕셔너리 키 값 체크하기 본문

Python/Python

파이썬에서 딕셔너리 키 값 체크하기

민Z 2016. 4. 22. 22:39

파이썬에서 딕셔너리 키 값 체크하기

(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_keyboolean 값을 리턴한다. 값이 있는지, 없는지만 체크하는 것이다.


이 때 쓸 수 있는 방법은 두 가지가 있다.

get in이다


1. get

menu = {"ham" : 1, "cucumber" : -12, "egg" : 100}

if menu.get("ham"):

print "네, 찾는 것이 있네요"

else:

print "그런 메뉴는 없습니다."

2. in

menu = {"ham" : 1, "cucumber" : -12, "egg" : 100}

if "ham" in menu:

print "네, 찾는 것이 있네요"

else:

print "그런 메뉴는 없습니다."

파이썬에서 거짓(False)로 판별하는 것들이 몇 가지가 있는데, 0이나 빈 리스트, 빈 스트링, 빈 딕셔너리, 빈 튜플 등이다.


get은 키에 해당하는 값을 넘겨주기 때문에 값이 있다면 True고 없다면 False(...일 것 같지만 실제로는 None을 리턴한다. NoneFalse가 아니긴 하지만.... 어차피 키 값 판별이니 True가 아니므로 없는 메뉴에 대해서는 else로 빠진다.) 가 된다.


get은 값을 넘겨주게 되고, 값이 있다면 파이썬에서는 True로 받아들인다.


두 번째, in의 경우엔 boolean값이 리턴되는데 값이 아니라 있는지, 없는지만 넘겨주게 된다.


그리고 마지막 방법이 하나 더 있는데 그것이 바로 키 값을 통해 직접 Value를 호출하는 것이다.

백마디말보다 코드 한 줄이 더 낫다.

menu = {"ham" : 1, "cucumber" : -12, "egg" : 100}

if menu["ham"]:

print "네, 찾는 것이 있네요"

else:

print "그런 메뉴는 없습니다."

기존에 C++이나 자바를 접했던 사람이라면 위 코드가 더 익숙하게 느껴지지 않을까? 아닐수도 있구.

암튼 위 코드 역시 get과 마찬가지로 Value를 리턴한다.


get과 다른 점이 있다면 없는 메뉴에 대해서 getNone을 리턴하지만 아래의 마지막 코드는 에러를 내뱉게 된다.

따라서 "kimch"를 찾는다면 아래 코드는 KeyError : "kimch"를 내뱉을 것이다.


마지막으로,

사실 getget(키, 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
Comments