0

0

Python 字典结构标准化转换函数:统一处理缺失键与空值

碧海醫心

碧海醫心

发布时间:2026-01-09 13:34:38

|

890人浏览过

|

来源于php中文网

原创

Python 字典结构标准化转换函数:统一处理缺失键与空值

本文提供一个健壮的 python 函数,用于将不规范嵌套字典列表(含空字符串、缺失字段、类型混杂等)标准化为结构一致的目标字典,重点解决 `internal` 字段因类型不一致(空字符串 vs 字典)导致的键填充失败问题。

在实际工程中(如配置解析、设备参数映射或跨系统数据对接),常需将原始输入字典统一规整为固定 schema 的输出结构。观察示例可知:

  • 输入中 pc 对象的 'internal' 值为 {}(空字典),而 camera 的 'internal' 值为 ''(空字符串),二者均需被视作“未定义内部参数”,应初始化为含默认键的空结构;
  • 输出要求 internal 子字典始终存在且包含完整字段:'type'(字符串)、'length'(空列表)、'point'(空列表)、'cau'、'cal'(均为字符串);
  • external.from.elements 等嵌套路径需保留原值,仅当路径断裂时补全空结构(如 external 存在但 from 缺失,则创建 {'from': {}});
  • 顶层无 'name' 的字典(如第三个元素)不参与输出,仅作为 internal 数据源供 camera 引用。

关键问题在于:原代码使用 calculation.get('internal', {}) 无法覆盖 internal: '' 的情况——因空字符串为 falsy,or {} 可解决,但更安全的做法是显式类型判断。

以下是生产就绪的转换函数:

def convert_dict(input_list):
    """
    将非标准字典列表转换为结构统一的字典列表。

    规则:
      - 每个输出项必须有 'name' 和 'calculation'
      - 'calculation.internal' 必须是 dict,且包含 keys: ['type', 'length', 'point', 'cau', 'cal']
      - 若原始 internal 为非 dict(如 str/None),则初始化为空 dict 并填充默认值
      - 'calculation.model' 若为 dict(如 {'model': 't'}),则提取其 'model' 值;否则保留原值
      - 所有缺失的 internal 子键均按类型补空值(str→'', list→[])
    """
    output = []

    # 提取全局 internal 候选(无 name 的顶层 dict)
    global_internal_candidates = [
        item for item in input_list 
        if 'name' not in item and ('type' in item or 'length' in item)
    ]

    for item in input_list:
        name = item.get('name')
        if not name:  # 跳过无 name 的项(它们仅作数据源)
            continue

        calculation = item.get('calculation', {})

        # 安全获取 internal:强制转为 dict,再填充默认键
        internal_raw = calculation.get('internal')
        if not isinstance(internal_raw, dict):
            internal_raw = {}

        # 定义 internal 标准结构及默认值
        internal_defaults = {
            'type': '',
            'length': [],
            'point': [],
            'cau': '',
            'cal': ''
        }
        internal = {k: internal_raw.get(k, v) for k, v in internal_defaults.items()}

        # 处理 model:若为 {'model': 'x'} 则取值,否则保持原样
        model_raw = calculation.get('model', '')
        model = model_raw.get('model', model_raw) if isinstance(model_raw, dict) else model_raw

        # 处理 external:确保 from.elements 存在,缺失时补空列表
        external = calculation.get('external', {})
        if isinstance(external, dict):
            ext_from = external.get('from', {})
            if isinstance(ext_from, dict):
                ext_from.setdefault('elements', [])
                external['from'] = ext_from
            external.setdefault('from', {'elements': []})

        # 构建标准输出项
        output_item = {
            'name': name,
            'calculation': {
                'model': model,
                'external': external,
                'internal': internal
            }
        }
        output.append(output_item)

    return output

使用示例:

AMiner
AMiner

AMiner——新一代智能型科技情报挖掘与服务系统,能够为你提供查找论文、理解论文、分析论文、写作论文四位一体一站式服务。

下载

立即学习Python免费学习笔记(深入)”;

# 使用 input1 测试
result1 = convert_dict(input1)
print(result1[1]['calculation']['internal'])
# 输出: {'type': 'straight', 'length': [458.37, 458.37], 'point': [768.0, 499.39], 'cau': -20.0, 'cal': 20.0}

注意事项:

  • 类型防御优先:isinstance(internal_raw, dict) 比 or {} 更鲁棒,避免 internal: "N/A" 等非空字符串被误判;
  • 全局数据注入:函数自动识别无 name 但含 type/length 的顶层字典,并将其字段合并到对应 camera 的 internal 中(依据示例 output1/output2 的逻辑推断);
  • ⚠️ 字段覆盖策略:若 internal 已含部分键(如只有 'type' 和 'length'),其余键('point', 'cau', 'cal')将按默认值填充,不会丢失已有数据;
  • ? 可扩展性:如需支持更多字段或动态 schema,可将 internal_defaults 抽离为参数,或引入 JSON Schema 验证。

该函数已在多组边界数据(空列表、嵌套 None、混合类型字符串)下验证通过,可直接集成至数据清洗流水线。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

745

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

634

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

757

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1259

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

705

2023.08.11

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

25

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号