从嵌套数据结构中提取并重构字典:Pythonic 方法实践

从嵌套数据结构中提取并重构字典:Pythonic 方法实践

本文将介绍如何高效地从包含字典列表的复杂嵌套数据结构中,提取特定的键值对并重构为一个新的字典。通过利用 Python 的字典推导式(Dictionary Comprehension),我们可以简洁而高效地完成这一数据转换任务,提升代码的可读性和执行效率,特别适用于处理API返回的结构化数据。

在实际开发中,我们经常需要处理来自外部服务(如api)的复杂数据。这些数据通常以嵌套的字典和列表形式呈现。例如,我们可能从经纪商api获取到以下格式的金融工具数据:

api_data = {    '1': [        {'exch': 'NFO', 'token': '43214', 'tsym': 'NIFTY07DEC23C20700', 'weekly': 'W1', 'dname': 'NIFTY 07DEC23 20700 CE ', 'instname': 'OPTIDX', 'pp': '2', 'ls': '50', 'ti': '0.05', 'optt': 'CE'},        {'exch': 'NFO', 'token': '43218', 'tsym': 'NIFTY07DEC23P20700', 'weekly': 'W1', 'dname': 'NIFTY 07DEC23 20700 PE ', 'instname': 'OPTIDX', 'pp': '2', 'ls': '50', 'ti': '0.05', 'optt': 'PE'},        {'exch': 'NFO', 'token': '43206', 'tsym': 'NIFTY07DEC23C20600', 'weekly': 'W1', 'dname': 'NIFTY 07DEC23 20600 CE ', 'instname': 'OPTIDX', 'pp': '2', 'ls': '50', 'ti': '0.05', 'optt': 'CE'},        {'exch': 'NFO', 'token': '43207', 'tsym': 'NIFTY07DEC23P20600', 'weekly': 'W1', 'dname': 'NIFTY 07DEC23 20600 PE ', 'instname': 'OPTIDX', 'pp': '2', 'ls': '50', 'ti': '0.05', 'optt': 'PE'}    ]}

上述 api_data 是一个字典,其键 ‘1’ 对应的值是一个包含多个字典的列表。每个内部字典都代表一个金融工具的详细信息。我们的目标是从这个复杂结构中提取出每个工具的 token 和 tsym 信息,并将其重构为一个新的字典,其中 token 作为新字典的键,tsym 作为新字典的值。期望的输出格式如下:

# 期望的新字典格式{    '43214': 'NIFTY07DEC23C20700',    '43218': 'NIFTY07DEC23P20700',    '43206': 'NIFTY07DEC23C20600',    '43207': 'NIFTY07DEC23P20600'}

使用字典推导式进行数据重构

Python 提供了强大的字典推导式(Dictionary Comprehension),能够以简洁高效的方式创建新字典。对于上述数据重构需求,字典推导式是理想的解决方案。

核心思想是遍历 api_data[‘1’] 列表中的每一个内部字典,然后从每个内部字典中提取 ‘token’ 和 ‘tsym’ 键对应的值,并将它们作为新字典的键和值。

# 原始数据api_data = {    '1': [        {'exch': 'NFO', 'token': '43214', 'tsym': 'NIFTY07DEC23C20700', 'weekly': 'W1', 'dname': 'NIFTY 07DEC23 20700 CE ', 'instname': 'OPTIDX', 'pp': '2', 'ls': '50', 'ti': '0.05', 'optt': 'CE'},        {'exch': 'NFO', 'token': '43218', 'tsym': 'NIFTY07DEC23P20700', 'weekly': 'W1', 'dname': 'NIFTY 07DEC23 20700 PE ', 'instname': 'OPTIDX', 'pp': '2', 'ls': '50', 'ti': '0.05', 'optt': 'PE'},        {'exch': 'NFO', 'token': '43206', 'tsym': 'NIFTY07DEC23C20600', 'weekly': 'W1', 'dname': 'NIFTY 07DEC23 20600 CE ', 'instname': 'OPTIDX', 'pp': '2', 'ls': '50', 'ti': '0.05', 'optt': 'CE'},        {'exch': 'NFO', 'token': '43207', 'tsym': 'NIFTY07DEC23P20600', 'weekly': 'W1', 'dname': 'NIFTY 07DEC23 20600 PE ', 'instname': 'OPTIDX', 'pp': '2', 'ls': '50', 'ti': '0.05', 'optt': 'PE'}    ]}# 使用字典推导式重构数据reconstructed_dict = {item['token']: item['tsym'] for item in api_data['1']}print(reconstructed_dict)

输出结果:

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

{'43214': 'NIFTY07DEC23C20700', '43218': 'NIFTY07DEC23P20700', '43206': 'NIFTY07DEC23C20600', '43207': 'NIFTY07DEC23P20600'}

字典推导式解析

上述代码 reconstructed_dict = {item[‘token’]: item[‘tsym’] for item in api_data[‘1’]} 可以分解为以下几个部分理解:

for item in api_data[‘1’]: 这部分是迭代器,它会遍历 api_data 字典中键 ‘1’ 所对应的列表。在每一次迭代中,item 变量会依次绑定到列表中的每一个内部字典。item[‘token’]: item[‘tsym’]: 这部分定义了新字典的键值对。对于每一次迭代中的 item 字典,我们通过 item[‘token’] 获取其 token 键的值作为新字典的键,通过 item[‘tsym’] 获取其 tsym 键的值作为新字典的值。{…}: 外部的花括号表示正在创建一个新的字典。

这种方法不仅代码量少,而且执行效率高,是 Python 中处理此类数据转换的推荐方式。

注意事项与扩展

在实际应用中,处理从外部源获取的数据时,还需要考虑一些健壮性问题:

键不存在的情况: 如果 api_data[‘1’] 列表中的某个字典缺少 ‘token’ 或 ‘tsym’ 键,直接访问 item[‘token’] 或 item[‘tsym’] 将会引发 KeyError。为了避免这种情况,可以使用 dict.get() 方法提供一个默认值,或者在推导式中添加条件判断。

示例:使用 dict.get() 处理缺失键

api_data_with_missing_key = {    '1': [        {'exch': 'NFO', 'token': '43214', 'tsym': 'NIFTY07DEC23C20700'},        {'exch': 'NFO', 'tsym': 'NIFTY07DEC23P20700'}, # 缺少 'token'        {'exch': 'NFO', 'token': '43206'} # 缺少 'tsym'    ]}# 使用 .get() 方法,如果键不存在则返回 Nonereconstructed_dict_safe = {    item.get('token', 'MISSING_TOKEN'): item.get('tsym', 'MISSING_TSYM')    for item in api_data_with_missing_key['1']}print(reconstructed_dict_safe)# 输出可能为: {'43214': 'NIFTY07DEC23C20700', 'MISSING_TOKEN': 'NIFTY07DEC23P20700', '43206': 'MISSING_TSYM'}

示例:使用条件过滤

reconstructed_dict_filtered = {    item['token']: item['tsym']    for item in api_data_with_missing_key['1']    if 'token' in item and 'tsym' in item # 仅处理包含所需键的字典}print(reconstructed_dict_filtered)# 输出可能为: {'43214': 'NIFTY07DEC23C20700'}

键值冲突: 如果 token 值在原始列表中存在重复,那么在重构的新字典中,

以上就是从嵌套数据结构中提取并重构字典:Pythonic 方法实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1372942.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 12:45:35
下一篇 2025年12月14日 12:45:48

相关推荐

发表回复

登录后才能评论
关注微信