
在实际开发中,我们经常需要处理来自外部服务(如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']} 可以分解为以下几个部分理解:
这种方法不仅代码量少,而且执行效率高,是 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() 方法,如果键不存在则返回 None
reconstructed_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 方法实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号