비정형 데이터가 세계적으로 널리 활용되면서, 중첩 JSON처럼 깊게 중첩된 구조의 데이터를 자주 마주하게 됩니다. Python은 내부 키와 외부 키를 연결해 데이터를 평탄화(flatten)하는 방식으로 이러한 중첩 데이터 구조를 손쉽게 처리할 수 있습니다. 이 글에서는 중첩 딕셔너리를 하나의 평평한 딕셔너리로 변환하는 방법을 살펴보겠습니다.
재귀 함수를 활용한 방법
이 방식은 딕셔너리의 각 항목을 재귀적으로 순회하며 처리하는 함수를 직접 설계합니다. 입력 딕셔너리와 함께 출력용 딕셔너리, 부모 키(parent key), 그리고 구분자(separator)를 매개변수로 전달합니다. isinstance를 사용해 값이 또 다른 딕셔너리인지 확인하고, 딕셔너리라면 재귀 호출을 통해 계속해서 탐색합니다.
예제
dictA = {
"id": "0001",
"name": "hotdog",
"image":
{
"url": "images/0001.jpg",
"thumbnail":
{
"url": "images/thumbnails/0001.jpg",
"height,width": "2x4"
}
}
}
def dict_flatten(in_dict, dict_out=None, parent_key=None, separator="_"):
if dict_out is None:
dict_out = {}
for k, v in in_dict.items():
k = f"{parent_key}{separator}{k}" if parent_key else k
if isinstance(v, dict):
dict_flatten(in_dict=v, dict_out=dict_out, parent_key=k)
continue
dict_out[k] = v
return dict_out
final_dict = dict_flatten(dictA)
print(final_dict)출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
{
'id': '0001',
'name': 'hotdog',
'image_url': 'images/0001.jpg',
'image_thumbnail_url': 'images/thumbnails/0001.jpg',
'image_thumbnail_height,width': '2x4'
}결과를 보면 중첩되어 있던 키들이 _ 구분자로 연결되어 image_url, image_thumbnail_url처럼 한 단계의 평평한 구조로 변환된 것을 확인할 수 있습니다.
cherrypicker 라이브러리 사용하기
직접 함수를 작성하지 않고도 cherrypicker 모듈을 사용하면 간편하게 해결할 수 있습니다. 딕셔너리를 입력으로 전달하기만 하면 되며, 기본 구분자는 -입니다.
예제
from cherrypicker import CherryPicker
dictA = {
"id": "0001",
"name": "hotdog",
"image":
{
"url": "images/0001.jpg",
"thumbnail":
{
"url": "images/thumbnails/0001.jpg",
"height,width": "2x4"
}
}
}
picker = CherryPicker(dictA)
print(picker.flatten().get())출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
{
'id': '0001',
'name': 'hotdog',
'image_url': 'images/0001.jpg',
'image_thumbnail_url': 'images/thumbnails/0001.jpg',
'image_thumbnail_height,
width': '2x4'
}두 가지 방법 모두 중첩된 데이터를 단일 레벨의 딕셔너리로 만들어 주므로, 데이터 분석이나 API 응답 처리 시 원하는 구분자와 상황에 맞게 선택해 사용하면 됩니다.