
在处理来自api或其他数据源的复杂数据时,我们经常会遇到嵌套的字典和列表结构。这些结构虽然能够承载丰富的信息,但在需要特定格式的数据进行进一步分析或处理时,往往需要进行有效的提取和转换。本教程将以一个典型的场景为例,展示如何利用python的强大功能,特别是字典推导式,来简化这一过程。
假设我们从经纪商API获取了以下交易数据:
my_dict = {
'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'}
]
}这个数据结构是一个字典,其唯一的键是字符串'1',对应的值是一个列表。这个列表中包含了多个字典,每个内层字典代表一个金融合约的详细信息。
我们的目标是从这个复杂结构中提取出每个合约的token和tsym信息,并将其组织成一个新的字典,其中token作为键,tsym作为值。期望的输出格式如下:
new_dict = {
'43214': 'NIFTY07DEC23C20700',
'43218': 'NIFTY07DEC23P20700',
'43206': 'NIFTY07DEC23C20600',
'43207': 'NIFTY07DEC23P20600'
}Python的字典推导式(Dictionary Comprehension)提供了一种简洁高效的方式来创建字典。它允许我们在一行代码中遍历可迭代对象,并根据每个元素生成键值对。
立即学习“Python免费学习笔记(深入)”;
针对上述问题,我们可以使用以下字典推导式:
dct = {d['token']: d['tsym'] for d in my_dict['1']}让我们逐步解析这个表达式:
将上述代码应用于原始数据,即可得到我们期望的扁平化字典。
完整代码示例:
my_dict = {
'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'}
]
}
# 使用字典推导式进行数据转换
new_dict = {d['token']: d['tsym'] for d in my_dict['1']}
print(new_dict)输出结果:
{'43214': 'NIFTY07DEC23C20700', '43218': 'NIFTY07DEC23P20700', '43206': 'NIFTY07DEC23C20600', '43207': 'NIFTY07DEC23P20600'}键的存在性检查: 在实际应用中,如果不能保证每个内层字典都包含'token'和'tsym'这两个键,直接访问可能会导致KeyError。为提高代码健壮性,可以加入条件判断或使用字典的get()方法:
# 使用get()方法提供默认值,避免KeyError
new_dict_safe = {d.get('token', 'UNKNOWN_TOKEN'): d.get('tsym', 'UNKNOWN_TSYM')
for d in my_dict['1'] if 'token' in d and 'tsym' in d}
# 或者,如果只希望处理包含这两个键的字典
new_dict_filtered = {d['token']: d['tsym']
for d in my_dict['1'] if 'token' in d and 'tsym' in d}数据结构深度: 本示例处理的是两层嵌套(字典中包含列表,列表中包含字典)。如果数据结构更深,例如字典中包含列表,列表中又包含字典,字典中还有列表,则需要更复杂的访问路径或多层嵌套的推导式,甚至递归函数。
可读性与复杂性: 字典推导式非常简洁,但对于非常复杂的转换逻辑,过度使用推导式可能会降低代码的可读性。在这种情况下,传统的for循环结合条件判断可能会是更好的选择。
性能: 字典推导式通常比显式的for循环更高效,因为它在C语言级别实现,减少了Python解释器的开销。对于大规模数据处理,这是一个显著优势。
通过本教程,我们学习了如何利用Python的字典推导式,从一个嵌套的字典列表中高效、简洁地提取并转换数据。这种方法不仅能够实现精准的数据筛选和格式转换,还能有效提升代码的执行效率和可读性。掌握字典推导式是Python数据处理中的一项核心技能,对于处理各种复杂数据结构都具有广泛的应用价值。在实际开发中,请务必考虑键的存在性、数据结构的复杂性以及代码的可读性,选择最合适的实现方式。
以上就是Python中从嵌套字典列表高效提取与转换数据的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号