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+ 浏览

开启你的 职业生涯

完成课程认证

开始
广告