늒네 기록

[python] dictionary, get 함수와 이것저것 본문

언어 공부 기록/python

[python] dictionary, get 함수와 이것저것

jaeha lee 2020. 9. 9. 23:09

파이썬에서 딕셔너리를 다룰 때 종종 마주칠 수 있는 상황.

x = {}
for i in range(5):
    x[i] = i*i

# x = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

for i in range(10):
    print(f'x[{i}] = {x[i]}')

#x[0] = 0
#x[1] = 1
#x[2] = 4
#x[3] = 9
#x[4] = 16
#Traceback (most recent call last):
#  File "cf.py", line 8, in <module>
#    print(f'x[{i}] = {x[i]}')
#KeyError: 5

x 안에 없는 키(위의 경우, 5)를 가지고 불러오려고 하는 경우, KeyError가 발생하며 돌던 것이 죽어버린다.

 

그렇다면, 처음부터 안에 들어있는 key들만 가지고 와서 출력하면 되는 것이 아닐까?

x = {}
for i in range(5):
    x[i] = i*i

# x = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

for k in x.keys(): # 혹은, x.keys() 대신 x만 써도 똑같이 작동한다.
    print(f'x[{k}] = {x[k]}')

#x[0] = 0
#x[1] = 1
#x[2] = 4
#x[3] = 9
#x[4] = 16

물론 이렇게 안에 있는 key들만 가지고 작업할 일만 있다면 참 좋겠지만, 그런 상황만 있는 것이 아니다. 그렇다면, key 에러가 나기 전에 넣어보려는 key가 x.keys() 안에 있는지 판별하면 되는 것이 아닐까?

x = {}
for i in range(5):
    x[i] = i*i

# x = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

for i in range(10):
    if i in x.keys(): print(f'x[{i}] = {x[i]}')
    else: print(f'key "{i}" not in x')

#x[0] = 0
#x[1] = 1
#x[2] = 4
#x[3] = 9
#x[4] = 16
#key "5" not in x
#key "6" not in x
#key "7" not in x
#key "8" not in x
#key "9" not in x

이렇게 하면 작동이야 하겠지만, 'if i in x.keys()'로 i가 x 안에 들어있는지 계속 판별을 해주어야 한다.

 

이와 같은 번거로움을 한 번에 해결해주는 것이 get(x, default) 함수이다.

x = {'hello':1}
print(x.get('hello')) # 1
print(x.get('world')) # None
print(x.get('world', 'doesn\'t exist')) # doesn't exist

get 함수는 get(받아오고싶은 키값, 키가 없을때 리턴할 디폴트 값)의 두 인수를 받을 수 있게 되어있고, 두 번째 인수를 비워두면 자동으로 None을 리턴하게 되어있다. 예를 들어, 이렇게 구현되어 있다고 생각하면 된다.

def get_mimic(x, key, default=None):
    return x[key] if key in x.keys() else default

x = {'hello':1}
print(get_mimic(x,'hello')) # 1
print(get_mimic(x,'world')) # None
print(get_mimic(x,'world', 'doesn\'t exist')) # doesn't exist
반응형
Comments