Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 중첩 딕셔너리를 평탄화하는 방법

비정형 데이터가 세계적으로 널리 활용되면서, 중첩 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 응답 처리 시 원하는 구분자와 상황에 맞게 선택해 사용하면 됩니다.