달나라 노트

Python Basic : get (dictionary에 존재하지 않는 key를 전달했을 때 발생하는 에러 해결. dictionary용 nvl) 본문

Python/Python Basic

Python Basic : get (dictionary에 존재하지 않는 key를 전달했을 때 발생하는 에러 해결. dictionary용 nvl)

CosmosProject 2022. 1. 5. 22:51
728x90
반응형

 

 

 

 

 

dict_test = {
    'a': 1,
    'b': 2,
    'c': 3,
}

sample_value = dict_test['d']
print(sample_value)


-- Result
KeyError: 'd'

위 코드를 실행시켜보면 KeyError가 발생합니다.

왜냐면 dict_test라는 dictionary에는 a, b, c라는 key가 존재하는데,

존재하지 않는 d라는 이름의 key를 전달했기 때문이죠.

 

위 예시에서처럼 간단한 dictionary를 사용하면 사실 KeyError가 발생할 일도 거의 없고, KeyError가 발생한다고 해도 금방 코드를 수정할 수 있습니다.

 

하지만 dictionary가 복잡해지고 경우에 따라 key의 종류가 변동될 수 있는 상황에서 dictionary의 key를 전달해야한다면 매번 KeyError가 발생할 때 마다 코드를 고쳐줘야 할 것입니다.

 

이러한 경우를 대비해서 dictionary에 존재하지 않는 key를 전달했을 때 어떤 값을 return해줄지 정할 수 있는 method가 있습니다.

 

바로 get method입니다.

 

dictionary.get(parameter_1, parameter_2)

get method는 위처럼 dictionary에 적용하여 사용할 수 있습니다.

get method는 첫 번째 인자인 parameter_1을 dictionary에 key로서 조회해보고,

만약 parameter_1이 dictionary에 존재하는 key라면 key=parameter_1인 value를 return해주며

만약 parameter_1이 dictionary에 존재하는 key가 아니라면 parameter_2를 return해줍니다.

 

dict_test = {
    'a': 1,
    'b': 2,
    'c': 3,
}

sample_value = dict_test.get('d', 0)
print(sample_value)


-- Result
0

처음에 봤던 예시에 get method를 적용했습니다.

get method는 첫 번째 인자를 먼저 dictionary에서 key로 조회해보고 없으면 두 번째 인자를 반환합니다.

따라서 d는 dict_test에 없으니까 그 다음 인자인 0을 return한 겁니다.

 

 

 

dict_test = {
    'a': 1,
    'b': 2,
    'c': 3,
}

sample_value = dict_test.get('b', 0)
print(sample_value)


-- Result
2

이번엔 get method에 b를 전달하였습니다.

b는 dict_test에 존재하는 key이므로 dict_test에서 key='b'인 value 즉, 2를 return합니다.

 

 

 

 

 

 

dict_test = {
    'a': {
        1: 10,
        2: 20,
        3: 30,
    },
    'b': {
        4: 40,
        5: 50,
        6: 60,
    }
}

sample_value_1 = dict_test.get('b', 0)
print(sample_value_1)

sample_value_2 = dict_test.get('d', 0)
print(sample_value_2)


-- Result
{4: 40, 5: 50, 6: 60}
0

dictionary 안에 dictionary가 있어도 get을 적용할 수 있습니다.

 

 

 

 

dict_test = {
    'a': {
        1: 10,
        2: 20,
        3: 30,
    },
    'b': {
        4: 40,
        5: 50,
        6: 60,
    }
}

sample_value_1 = dict_test['a'][1]
print(sample_value_1)

sample_value_2 = dict_test.get(['a'][1], 0)
print(sample_value_2)


-- Result
10
IndexError: list index out of range

 

- sample_value_1 = dict_test['a'][1]

보통 dictionary 안의 dictionary에 indexing을 하려면 sample_value_1에서 처럼 대괄호를 2번 연달아서 사용하면 됩니다.

 

- sample_value_2 = dict_test.get(['a'][1], 0)
하지만 get method를 사용할 때에는 단순히 대괄호 2개로 dictionary 속 dictionary를 사용하면 Error가 발생합니다.

 

 

이 경우 get method를 연달아 두 번 사용하는 것으로 대체할 수 있습니다.

아래 예시처럼 말이죠.

dict_test = {
    'a': {
        1: 10,
        2: 20,
        3: 30,
    },
    'b': {
        4: 40,
        5: 50,
        6: 60,
    }
}

sample_value_1 = dict_test.get('a', {}).get(1, 0)
print(sample_value_1)

sample_value_2 = dict_test.get('d', {}).get(1, 0)
print(sample_value_2)


-- Result
10
0

- sample_value_2 = dict_test.get('d', {}).get(1, 0)

첫 번째 get에서 인자를 ('d', {})로 적은 이유는

만약 dict_test의 key 중 d라는 key가 존재하지 않으면 {}를 return할 것이고 두 번째 get은 아무것도 없는 공백 dictionary {}에서 key = 1을 찾을 것입니다. 하지만 아무것도 없는 dictioanry이니 0을 반환하겠죠.


sample_value_2 = dict_test.get('d', 0).get(1, 0)

만약 위처럼 첫 번째 get에서 인자를 {}가 아닌 0으로 적어버리면

dict_test의 key중 d라는 key가 없을 경우 0을 return할 것이고,

0은 dictionary가 아니기 때문에 두 번째 get에서 error가 발생하게 됩니다.

따라서 가장 마지막으로 사용되는 get이 아니라면 두 번째 인자로 비어있는 dictionary {}를 적는 것이 좋습니다.

 

 

 

 

 

 

728x90
반응형
Comments