Python將巢狀字典轉換為扁平字典?


隨著世界擁抱更多非結構化資料,我們遇到了許多格式的資料,其中資料結構可以像巢狀 JSON 那樣深度巢狀。Python 能夠透過連線內部鍵和外部鍵來扁平化資料,從而處理巢狀資料結構。在本文中,我們將獲取一個巢狀字典並將其扁平化。

使用遞迴方法

在此方法中,我們設計一個函式以遞迴方式處理字典中的每個專案。我們傳遞字典,為輸出字典、鍵和分隔符設計一個佔位符作為引數。我們使用 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'
}

使用 cberrypicker

這是一個模組,可以透過將字典作為輸入直接使用。預設分隔符是 -。

示例

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'
}

更新時間: 12-Jan-2021

2K+ 瀏覽

開啟你的 職業生涯

完成課程認證

開始
廣告
© . All rights reserved.