Python中从复杂嵌套字典中提取并重构数据

Python中从复杂嵌套字典中提取并重构数据
最新回答
珍藏版╮宝贝

2021-02-16 22:23:39

在Python中,可以使用字典推导式从复杂嵌套字典中高效提取并重构数据,将特定字段(如'token'和'tsym')转换为新字典的键值对。以下是详细说明:

数据结构分析
  • 原始数据my_dict是一个嵌套字典,其顶级键为'1',对应一个包含多个子字典的列表。
  • 每个子字典包含金融工具的详细信息(如exch、token、tsym等字段)。
  • 示例数据结构如下:my_dict = { '1': [ {'exch': 'NFO', 'token': '43214', 'tsym': 'NIFTY07DEC23C20700', ...}, {'exch': 'NFO', 'token': '43218', 'tsym': 'NIFTY07DEC23P20700', ...}, ... ]}
目标转换
  • 从每个子字典中提取'token'和'tsym'字段,重构为新字典:

    :子字典的'token'值(如'43214')。

    :子字典的'tsym'值(如'NIFTY07DEC23C20700')。

  • 预期输出:new_dict = { '43214': 'NIFTY07DEC23C20700', '43218': 'NIFTY07DEC23P20700', ...}
解决方案:字典推导式
  • 核心语法:{key_expr: value_expr for item in iterable}。
  • 实现代码:new_dict = {d['token']: d['tsym'] for d in my_dict['1']}
  • 代码解析

    my_dict['1']:访问顶级键'1'对应的列表。

    for d in my_dict['1']:遍历列表中的每个子字典。

    d['token']和d['tsym']:分别提取子字典的键和值。

    最终生成形如{token: tsym}的新字典。

完整示例与输出my_dict = { '1': [ {'exch': 'NFO', 'token': '43214', 'tsym': 'NIFTY07DEC23C20700', ...}, {'exch': 'NFO', 'token': '43218', 'tsym': 'NIFTY07DEC23P20700', ...}, {'exch': 'NFO', 'token': '43206', 'tsym': 'NIFTY07DEC23C20600', ...}, {'exch': 'NFO', 'token': '43207', 'tsym': 'NIFTY07DEC23P20600', ...} ]}new_dict = {d['token']: d['tsym'] for d in my_dict['1']}print(new_dict)

输出结果

{ '43214': 'NIFTY07DEC23C20700', '43218': 'NIFTY07DEC23P20700', '43206': 'NIFTY07DEC23C20600', '43207': 'NIFTY07DEC23P20600'}注意事项与最佳实践
  1. 键的唯一性

    字典键必须唯一。若原始数据中存在重复'token',后出现的键值对会覆盖前者。

    示例:若有两个子字典的'token'均为'43214',新字典中仅保留最后一个值。

  2. 键值存在性检查

    若子字典可能缺失'token'或'tsym',直接访问会引发KeyError。

    改进方案:使用.get()方法提供默认值,或添加条件过滤:new_dict_robust = { d.get('token'): d.get('tsym') for d in my_dict.get('1', []) if d.get('token') is not None and d.get('tsym') is not None}

  3. 性能优化

    字典推导式在C语言级别实现,比传统for循环更高效,尤其适合大规模数据集。

  4. 可读性

    字典推导式简洁直观,适合简单映射场景。复杂逻辑建议拆分为多步操作或函数。

总结
  • 字典推导式是Python中处理嵌套数据转换的利器,兼具简洁性与高效性。
  • 通过合理设计键值表达式,可快速实现数据筛选、重组和扁平化。
  • 实际应用中需注意键唯一性、字段存在性及性能需求,以编写健壮代码。