如何在 Python 中递归扁平化嵌套字典列表


本文介绍一种通用、可扩展的递归方法,将具有深层嵌套结构(如按地域层级展开)的字典列表扁平化为单一层级的字典列表,保留关键字段(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  #  


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: php下载安装后swoole扩展怎么安装_异步框架支持【汇总】  Python与MongoDB NoSQL开发实战_文档模型与索引优化  Win11系统占用空间大怎么办 Win11深度瘦身清理指南【优化】  如何在 ACF 中正确更新嵌套多层的 Group 字段子字段  MySQL 中使用 IF 和 CASE 实现查询字段条件化显示  Win11如何卸载OneDrive_Win11卸载OneDrive方法【教程】  如何在Golang中优化文件读写性能_使用缓冲和并发处理  Go语言中CookieJar的持久化机制解析:内存存储与自定义持久化方案  Win11怎么关闭系统声音_Win11系统提示音静音设置【详解】  Python解释执行模型_字节码流程说明【指导】  如何在Golang中实现文件下载_Golang文件传输与内容类型处理方法  Windows蓝屏错误0x00000023怎么修复_FAT文件系统错误处理  win11如何清理传递优化文件 Win11为C盘瘦身删除更新缓存【技巧】  Win11怎么设置快速访问主页_Windows11资源管理器文件夹选项  Mac怎么给文件夹加密_Mac创建加密磁盘映像教程【安全】  Windows10怎么卸载预装软件_Windows10预装软件卸载步骤【教程】  Windows蓝屏BAD_POOL_HEADER故障详解_蓝屏池损坏错误修复指南  如何使用Golang捕获并记录协程panic_保证主程序稳定运行  如何使用Golang实现基本类型比较_Golang比较操作符使用方法  如何使用Golang实现微服务状态监控_Golang服务运行状态采集方法  php中::能用于接口静态方法吗_接口静态方法调用规则【操作】  手机php怎么转mp4_手机端php文件转mp4app推荐【指南】  Windows10系统怎么查看硬盘健康_Win10 SMART信息检测工具  c++的mutex和lock_guard如何使用 互斥锁保护共享资源【多线程】  MAC如何启用访达侧边栏显示_MAC Finder偏好设置与常用目录添加【教程】  Win10如何更改网络连接_Windows10以太网属性IP配置  Windows10系统怎么查看CPU核心数_Win10逻辑处理器数量查看  Mac的Time Machine怎么用_Mac系统备份与数据恢复【完整指南】  Win11屏幕亮度突然变暗怎么解决_自动变暗问题处理  Linux怎么设置磁盘配额_Linux系统Quota安装与用户空间限制【教程】  如何在Golang中定义接口_抽象方法和多态实现  Win11快速助手怎么用_Win11远程协助连接教程【工具】  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  如何在Golang中写入JSON文件_保存结构体数据到文件  Go 中 := 短变量声明的类型推导机制详解  如何从 Go 的 map[string]interface{} 中安全获取值  如何在Golang中修改数组元素_通过指针实现原地更新  Win11怎么设置按流量计费_Win11限制后台流量消耗【网络】  如何在 Go 开发中正确处理本地包导入与远程模块路径的一致性问题  php控制舵机角度怎么调_php发送pwm信号控制舵机转动【解答】  Windows10系统怎么查看显卡驱动_Win10设备管理器驱动更新  如何在Golang中处理模块包路径变化_Golang包重命名与导入方法  本地php环境出现502错误_nginx或apache502badgateway解决技巧【解答】  Win11怎么设置DNS服务器_Windows11修改网络适配器DNS优选  Python与OpenAI接口集成实战_生成式AI应用场景解析  Win11如何更新显卡驱动 Win11检查和安装设备驱动程序【方法】  c++怎么处理多线程死锁_c++ lock_guard与unique_lock锁管理【技巧】  为什么Go建议使用error接口作为错误返回_Go Error接口设计原因说明  windows如何修改文件默认打开方式_windows设置程序关联教程  c++中如何进行二进制文件读写_c++ read与write函数用法 

 2025-12-31

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.