如何在 Python 中递归扁平化嵌套字典列表
发布时间 - 2025-12-31 00:00:00 点击率:次本文介绍一种通用、可扩展的递归方法,将具有深层嵌套结构(如按地域层级展开)的字典列表扁平化为单一层级的字典列表,保留关键字段(person、city、address、facebooklink),并自动提取每层的业务数据。
在处理地理层级、组织架构或树状分类等嵌套 JSON 数据时,常遇到类似如下结构:顶层是国家,其下以键名(如 "united states")存储子列表,每个子项又包含同构字段及下一级嵌套键(如 "ohio" → "clevland" → "Street A")。目标不是简单展开数组,而是逐层提取有效业务对象,忽略作为容器的动态键名,仅保留含 person、city、address、facebooklink 等语义字段的字典。
以下是一个健壮、可读性强的递归实现:
def flatten_objects(data):
"""
递归扁平化嵌套字典列表。
假设每个有效节点都包含 person/city/address/facebooklink 字段;
动态键(如 "united states", "ohio")对应子列表,需递归处理。
"""
result = []
# 支持输入为单个 dict 或 list of dict
if isinstance(data, dict):
data = [data]
for item in data:
# 提取当前层级的业务字段(非嵌套值)
base_fields = {}
nested_lists = {}
for key, value in item.items():
# 若 value 是 list 且所有元素均为 dict,则视为嵌套子结构
if isinstance(value, list) and value and all(isinstance(v, dict) for v in value):
nested_lists[key] = value
else:
base_fields[key] = value
# 当前层级有有效字段 → 保存
if base_fields:
result.append(base_fields)
# 递归处理每个嵌套列表
for sublist in nested_lists.values():
result.extend(flatten_objects(sublist))
return result✅ 使用示例:
nested_data = [
{
"person": "abc",
"city": "united states",
"facebooklink": "link",
"address": "united states",
"united states": [
{
"person": "cdf",
"city": "ohio",
"facebooklink": "link",
"address": "united states/ohio",
"ohio": [
{
"person": "efg",
"city": "clevland",
"facebooklink": "link",
"address": "united states/ohio/clevland",
"clevland": [
{
"person": "jkl",
"city": "Street A",
"facebooklink": "link",
"address": "united states/ohio/clevland/Street A",
"Street A": [
{
"person": "jkl",
"city": "House 1",
"facebooklink": "link",
"address": "united states/ohio/clevland/Street A/House 1"
}
]
}
]
},
{
"person": "ghi",
"city": "columbus",
"facebooklink": "link",
"address": "united states/ohio/columbus"
}
]
},
{
"person": "abc",
"city": "washington",
"facebooklink": "link",
"address": "united states/washington"
}
]
}
]
flattened = flatten_objects(nested_data)
for obj in flattened:
print(obj)⚠️ 注意事项:
- 该函数不依赖外部库(如 flatten_json),避免因键名动态性导致的路径解析失败;
- 判断嵌套的标准是:value 为非空 list,且所有元素均为 dict —— 这能准确区分数据容器与普通字段(如 "facebooklink": "link");
- 若原始数据中存在同名字段(如某层 "address" 是字符串,另一层是对象),需提前清洗,本函数默认按字符串/基础类型处理;
- 时间复杂度为 O(N),其中 N 是所有嵌套字典节点总数;空间复杂度为 O(D),D 为最大嵌套深度(递归栈开销)。
? 进阶建议:如需保留层级路径信息(例如增加 "level": 2, "parent": "ohio" 字段),可在递归调用时传入上下文参数;若需支持异构结构(混合 list/dict/str),可进一步增强类型判断逻辑
。但对本文所示的典型地域树结构,上述实现已简洁、高效且易于维护。
# python
# js
# json
# app
# facebook
# 栈
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
百度浏览器如何管理插件 百度浏览器插件管理方法
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
如何在阿里云部署织梦网站?
如何有效防御Web建站篡改攻击?
如何在新浪SAE免费搭建个人博客?
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
lovemo网页版地址 lovemo官网手机登录
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
如何快速搭建高效WAP手机网站吸引移动用户?
LinuxCD持续部署教程_自动发布与回滚机制
实例解析angularjs的filter过滤器
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
JS经典正则表达式笔试题汇总
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
php json中文编码为null的解决办法
bing浏览器学术搜索入口_bing学术文献检索地址
黑客如何利用漏洞与弱口令入侵网站服务器?
jQuery validate插件功能与用法详解
高防服务器租用首荐平台,企业级优惠套餐快速部署
北京的网站制作公司有哪些,哪个视频网站最好?
中国移动官方网站首页入口 中国移动官网网页登录
Laravel定时任务怎么设置_Laravel Crontab调度器配置
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
如何快速搭建高效WAP手机网站?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
Laravel如何使用Gate和Policy进行授权?(权限控制)
Laravel Fortify是什么,和Jetstream有什么关系
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
郑州企业网站制作公司,郑州招聘网站有哪些?
Laravel如何处理异常和错误?(Handler示例)
如何快速搭建高效简练网站?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
如何快速上传建站程序避免常见错误?
Laravel如何实现本地化和多语言支持?(i18n教程)
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
轻松掌握MySQL函数中的last_insert_id()
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
Laravel如何使用Blade组件和插槽?(Component代码示例)
如何快速查询域名建站关键信息?
如何快速搭建高效可靠的建站解决方案?
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
上一篇:详解10分钟学会vue滚动行为
上一篇:详解10分钟学会vue滚动行为

