파이썬에서는 딕셔너리의 값(value)으로 또 다른 딕셔너리를 사용함으로써 다차원(중첩) 딕셔너리를 손쉽게 만들 수 있습니다. 먼저 아래와 같이 세 개의 딕셔너리 객체를 선언해 보겠습니다.
>>> d1 = {"name": "Ravi", "age": 25, "marks": 60}
>>> d2 = {"name": "Anil", "age": 23, "marks": 75}
>>> d3 = {"name": "Asha", "age": 20, "marks": 70}
이제 이 세 개의 딕셔너리를 하나의 부모(parent) 딕셔너리 안에 값으로 담아 보겠습니다.
>>> twodimdict = {1: d1, 2: d2, 3: d3}
>>> twodimdict
{1: {'name': 'Ravi', 'age': 25, 'marks': 60}, 2: {'name': 'Anil', 'age': 23, 'marks': 75}, 3: {'name': 'Asha', 'age': 20, 'marks': 70}}
여기서 d1, d2, d3가 각각 키 1, 2, 3에 대응하는 값으로 할당되었습니다. 이렇게 하면 학생 번호를 키로 삼아 여러 학생 정보를 한 번에 관리할 수 있는 2차원 형태의 자료구조가 완성됩니다.
중첩 딕셔너리의 값에 접근하기
twodimdict[1]을 실행하면 첫 번째 딕셔너리인 d1이 반환됩니다. d1 내부의 특정 키 값은 아래와 같이 키를 연속으로 지정하여 얻을 수 있습니다.
>>> twodimdict[1]
{'name': 'Ravi', 'age': 25, 'marks': 60}
>>> twodimdict[1]["age"]
25
즉, 바깥쪽 딕셔너리의 키로 내부 딕셔너리를 꺼낸 뒤, 다시 그 딕셔너리의 키를 지정하면 원하는 값에 도달할 수 있습니다. 필요하다면 twodimdict[2]["marks"]처럼 몇 단계든 계층적으로 접근이 가능합니다.
주의할 점
딕셔너리의 항목은 리스트와 달리 인덱스(index)로 접근할 수 없습니다. 반드시 키(key)를 통해서만 값을 조회해야 하며, 존재하지 않는 키를 사용하면 KeyError가 발생합니다. 이를 방지하려면 기본값을 반환하는 get() 메서드를 활용하는 것이 좋습니다.
>>> twodimdict[1].get("address", "정보 없음")
'정보 없음'
참고: defaultdict로 자동 중첩 구조 만들기
계층이 깊은 다차원 딕셔너리를 동적으로 생성할 때는 collections 모듈의 defaultdict를 활용하면 편리합니다. 존재하지 않는 키에 접근해도 자동으로 빈 딕셔너리가 생성되므로 별도의 초기화 과정이 필요 없습니다.
>>> from collections import defaultdict
>>> nested = defaultdict(dict)
>>> nested[1]["name"] = "Ravi"
>>> nested
defaultdict(<class 'dict'>, {1: {'name': 'Ravi'}})
이처럼 파이썬의 딕셔너리는 값으로 모든 객체를 담을 수 있기 때문에, 중첩 구조를 활용하면 JSON 데이터 처리나 설정 파일 관리 등 실무에서 매우 유용하게 사용할 수 있습니다.