키와 값이 매핑되어 키를 통해 값에 접근할 수 있는 자료형태를 딕셔너리라고 한다. 이 글에서는 코딩 테스트 해시에서 사용되는 기본적인 딕셔너리 초기화와 함수에 대해 알아보고자 한다.
dict_a={"name":"홍길동","age":16}
위의 코드 처럼 값을 일일히 지정함으로 초기화를 할 수 있다.
딕셔너리를 초기화하는 다른 방법은 collections.defaultdict
를 사용하는 것이다. 위의 방식으로 딕셔너리를 생성하는 것과 달리 값에 대한 기본 값을 설정함으로 번거로움을 일부 덜 수 있다.
from collections import defaultdict
dict_a=defaultdict(list)
dict_a["key"]
print(dict_a)
# 결과: defaultdict(<class 'list'>, {'key': []})
기본 딕셔너리에서 존재하지 않는 키를 사용하면 KeyError
를 발생시키지만 defaultdict
를 사용하면 KeyError
가 발생하지 않는다. 다만 아래 코드와 같이 default를 설정하지 않은 상황에서 존재하지 않는 키에 접근한다면 keyError
가 발생한다. 아래 코드는 default값을 설정하지 않고, 특정 키의 값을 설정한 코드이다.
from collections import defaultdict
dict_a = defaultdict(key_a=1, key_b=2)
print(dict_a)
# 결과: defaultdict(None, {'key_a': 1, 'key_b': 2})
print(dict_a["key_c"])
# 결과: KeyError
위에서 설명했듯이 파이썬의 딕셔너리에서 존재하지 않는 키의 값을 가져오려 한다면 KeyError
가 발생한다. 만약 키가 이미 존재하는지 확인하고 싶다면 in
을 사용하는 방법이 있다.
dict_a={"name":"홍길동","age":16}
if "name" in dict_a:
print(dict_a["name"])
# 결과: 홍길동
다른 방법은 get()
함수를 사용하는 것이다. get()
함수는 딕셔너리에 키가 존재한다면 해당하는 값을 리턴한다. 그러나 존재하지 않는 키를 get()
의 인자에 입력한다면 KeyError
가 아닌 None
을 리턴한다. 따라서 KeyError
를 발생시키지 않으려면 in
이나 get()
을 이용해 키의 존재 여부를 파악하는 것이 좋다. 위에서 설명한 defaultdict
를 사용하는 것도 KeyError
를 발생시키지 않는 하나의 방법이 될 수 있겠다.
get()
에 두번째 인자를 줄 수 있는데 이는 키 값이 없을 경우 반환되는 값이다.
dict_a = {"name": "홍길동", "age": 16}
print(dict_a.get("name")) # 결과: 홍길동
print(dict_a.get("phone")) # 결과: None
print(dict_a.get("phone", "010-1234-5678")) # 결과: 010-1234-5678
keys()
함수는 딕셔너리의 키 리스트를 만드는 함수이다.
dict_a = {"name": "홍길동", "age": 16,"sex":"남"}
print(dict_a.keys())
# 결과: dict_keys(['name', 'age', 'sex'])
keys 함수, values함수, items함수 사용시 각각 dict_keys, dict_values, dict_items 객체를 리턴하는데 이는 메모리 낭비를 줄이기 위함이다. append, sort 등의 함수를 사용하고 싶다면 list로 변환하면 된다.
values()
함수는 딕셔너리의 값 리스트를 만드는 함수이다.
dict_a = {"name": "홍길동", "age": 16, "sex": "남"}
print(dict_a.values())
# 결과: dict_values(['홍길동', 16, '남'])
items()
함수는 key, value 쌍을 튜플로 묶은 값의 리스트를 만드는 함수이다.
dict_a = {"name": "홍길동", "age": 16, "sex": "남"}
print(dict_a.items())
print(list(dict_a.items()))
# 결과: dict_items([('name', '홍길동'), ('age', 16), ('sex', '남')])
# [('name', '홍길동'), ('age', 16), ('sex', '남')]
사실 zip()
함수는 두개의 리스트를 합쳐 zip객체를 만드는 함수이다. 이 zip 객체를 dict
로 형변환 하면 두개의 리스트형으로 딕셔너리형을 만들 수 있게 된다. 딕셔너리를 만드는데 참고하면 좋을 것 같아 포함시킨 함수이다.
name = ["홍길동", "고길동"]
age = [16, 17]
print(dict(zip(name, age)))
# 결과: {'홍길동': 16, '고길동': 17}