Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Chuyển đổi dictionary lồng nhau thành dictionary phẳng (flattened) trong Python

Khi làm việc với dữ liệu lồng nhau (nested JSON), thường cần làm phẳng (flatten) bằng cách nối khóa cha và khóa con với dấu phân cách.

Cách 1: Đệ quy (recursive)

Viết hàm đệ quy duyệt dictionary. Nếu giá trị là dictionary, gọi đệ quy với khóa cha mới (khóa cha + separator + khóa con). Nếu không, gán vào dictionary kết quả.

Ví dụ

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)

Kết quả

{
    'id': '0001',
    'name': 'hotdog',
    'image_url': 'images/0001.jpg',
    'image_thumbnail_url': 'images/thumbnails/0001.jpg',
    'image_thumbnail_height,width': '2x4'
}

Cách 2: Sử dụng thư viện cherrypicker

Thư viện cherrypicker cung cấp phương thức flatten() trực tiếp.

Ví dụ

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())

Kết quả

{
    'id': '0001',
    'name': 'hotdog',
    'image_url': 'images/0001.jpg',
    'image_thumbnail_url': 'images/thumbnails/0001.jpg',
    'image_thumbnail_height, width': '2x4'
}