新闻中心
Python中处理嵌套字典与列表数据:提取与条件过滤教程

本教程详细讲解如何在python中处理复杂的嵌套字典与列表数据结构。我们将学习如何层层深入访问特定数据,迭代列表中的字典,并应用条件逻辑对数据进行过滤和提取,最终生成符合要求的结果集。
在现代数据处理中,我们经常会遇到结构复杂、多层嵌套的数据,尤其是在处理API响应或配置文件时。Python的字典(dictionary)和列表(list)是处理这类数据的核心工具。本教程将以一个具体的案例为例,演示如何从一个包含字典和列表的嵌套结构中,提取特定信息并根据条件进行过滤。
1. 理解数据结构
首先,我们来看一个典型的嵌套数据结构示例:
repo = {
'code': 200,
'msg': '',
'snapshotVos': [
{
'data': {
'balances': [
{'asset': 'ADD', 'free': '10', 'locked': '0'},
{'asset': 'RDP', 'free': '0', 'locked': '0'},
{'asset': 'SHIB', 'free': '0', 'locked': '947415'}
],
'totalAsset': '152'
},
'type': 'spot',
'updateTime': 1703807999000
}
]
}这个 repo 字典包含以下层级:
- 顶层是字典,包含 code, msg, snapshotVos 键。
- snapshotVos 对应一个列表,列表的每个元素又是一个字典。
- snapshotVos 列表中的字典包含 data, type, updateTime 键。
- data 键对应的值又是一个字典,包含 balances 和 totalAsset。
- balances 键对应的值是一个列表,列表的每个元素都是一个字典,包含 asset, free, locked 键。
我们的目标是从 balances 列表中提取数据,并过滤掉那些 free 和 locked 值都为 '0' 的条目。
2. 逐步访问与迭代数据
要访问 balances 列表,我们需要按照其层级结构逐步深入。
- 访问 snapshotVos 列表: repo['snapshotVos']
- 迭代 snapshotVos 列表中的每个字典: 使用 for 循环。
- 从每个字典中访问 data 键: re['data']
- 从 data 字典中访问 balances 列表: re['data']['balances']
- 迭代 balances 列表中的每个字典: 再次使用 for 循环。
rows1 = [] # 用于存储最终结果
for snapshot_item in repo['snapshotVos']:
# 访问 'data' 字典
data_content = snapshot_item['data']
# 访问 'balances' 列表
balances_list = data_content['balances']
for balance_entry in balances_list:
# balance_entry 现在是 {'asset': 'ADD', 'free': '10', 'locked': '0'} 这样的字典
# ... 在这里进行过滤和提取操作3. 实现条件过滤
根据需求,我们需要移除那些 free 和 locked 值都为 '0' 的条目。这可以通过一个 if 语句来实现:
if not (balance_entry['free'] == '0' and balance_entry['locked'] == '0'):
# 如果不满足 'free' 和 'locked' 都为 '0' 的条件,则保留该条目
# ... 执行提取操作这里的 not (...) 逻辑表示:如果 free 等于 '0' 并且 locked 也等于 '0',那么整个条件 (balance_entry['free'] == '0' and balance_entry['locked'] == '0') 为 True,经过 not 后变为 False,该条目将被跳过。反之,如果其中任何一个不为 '0',则条件为 False,经过 not 后变为 True,该条目被处理。
4. 提取并格式化目标数据
在满足过滤条件的条目中,我们需要提取其值。根据原始问题的意图,我们可能需要将每个 balance_entry 字典的值转换为一个列表,并确保结果列表中不包含重复的条目。
val = list(balance_entry.values()) # 将字典的值转换为列表,例如 ['ADD', '10', '0']
if val not in rows1: # 检查该值列表是否已存在于结果集中,避免重复
rows1.append(val)5. 完整代码示例
将上述所有步骤整合起来,形成完整的解决方案:
GoEnhance
全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。
347
查看详情
repo = {
'code': 200,
'msg': '',
'snapshotVos': [
{
'data': {
'balances': [
{'asset': 'ADD', 'free': '10', 'locked': '0'},
{'asset': 'RDP', 'free': '0', 'locked': '0'},
{'asset': 'SHIB', 'free': '0', 'locked': '947415'}
],
'totalAsset': '152'
},
'type': 'spot',
'updateTime': 1703807999000
}
]
}
rows1 = [] # 初始化一个空列表,用于存储最终过滤后的数据
# 遍历 'snapshotVos' 列表中的每一个字典
for snapshot_item in repo['snapshotVos']:
# 访问当前 snapshot_item 字典中的 'data' 键
data_content = snapshot_item['data']
# 访问 data_content 字典中的 'balances' 键,它是一个列表
balances_list = data_content['balances']
# 遍历 balances_list 中的每一个 balance_entry 字典
for balance_entry in balances_list:
# 检查 'free' 和 'locked' 字段是否都为 '0'
# 如果不是都为 '0' (即至少有一个不为 '0'),则执行以下操作
if not (balance_entry['free'] == '0' and balance_entry['locked'] == '0'):
# 将当前 balance_entry 字典的所有值转换为一个列表
# 例如 {'asset': 'ADD', 'free': '10', 'locked': '0'} 会变成 ['ADD', '10', '0']
val = list(balance_entry.values())
# 检查这个值列表是否已经存在于 rows1 中,防止添加重复项
if val not in rows1:
# 如果不存在,则将其添加到 rows1 列表中
rows1.append(val)
print(rows1)运行结果:
[['ADD', '10', '0'], ['SHIB', '0', '947415']]
可以看到,['RDP', '0', '0'] 这个条目因为 free 和 locked 都为 '0' 而被成功过滤掉了。
6. 注意事项与进阶
-
健壮性处理: 在实际应用中,数据结构可能不总是完美的。例如,某个字典可能缺少 free 或 locked 键。为了避免 KeyError,可以使用 dict.get() 方法提供默认值,或使用 try-except 块。
# 示例:使用 .get() 避免 KeyError free_val = balance_entry.get('free', '0') # 如果 'free' 键不存在,默认为 '0' locked_val = balance_entry.get('locked', '0') if not (free_val == '0' and locked_val == '0'): # ... 数据类型: 示例中的 free 和 locked 值是字符串 '0'。如果它们是数字 0,则比较时应使用 balance_entry['free'] == 0。在从外部数据源(如JSON)获取数据时,经常会遇到数字以字符串形式表示的情况,需要注意类型转换。
-
列表推导式: 对于更简洁的代码,可以使用列表推导式(List Comprehension)来完成过滤和提取:
rows_filtered = [] for snapshot_item in repo['snapshotVos']: for balance_entry in snapshot_item['data']['balances']: if not (balance_entry.get('free', '0') == '0' and balance_entry.get('locked', '0') == '0'): # 如果不需要去重,直接 append 字典 rows_filtered.append(balance_entry) # 如果需要去重,并且去重是基于字典内容,可能需要转换为元组或使用集合 # rows_filtered.append(tuple(balance_entry.items())) # 转换为元组以便去重 # 如果要转换为列表的值并去重 unique_values_list = [] seen_values = set() # 使用集合进行高效去重 for item in rows_filtered: current_values = tuple(item.values()) # 转换为元组以便加入集合 if current_values not in seen_values: seen_values.add(current_values) unique_values_list.append(list(current_values)) # 最终存储为列表 print(unique_values_list)这种方式在处理复杂去重逻辑时更为灵活。
输出格式: 原始问题要求将字典值转换为列表并去重。如果希望保留原始字典结构,则可以直接 rows1.append(balance_entry)。根据具体需求选择最合适的输出格式。
总结
通过本教程,我们学习了如何有效地在Python中导航和操作复杂的嵌套字典和列表结构。关键在于理解数据层级,使用嵌套循环逐步深入,并结合条件判断进行数据过滤。掌握这些技巧将使您能够更灵活、高效地处理各种复杂的数据集。在实际开发中,考虑代码的健壮性、数据类型匹配以及选择合适的Python特性(如列表推导式)来提高代码的可读性和效率至关重要。
以上就是Python中处理嵌套字典与列表数据:提取与条件过滤教程的详细内容,更多请关注其它相关文章!
# 遍历
# 南汇网站推广选哪家
# 百度推广营销计划ppt
# 东城优化网站
# 松江区网站建设企业
# 行唐网站建设费用
# 晋城外贸网站推广公司招聘
# 万州定制网站建设
# 营销和推广区别在哪里呢
# 吉林视频网站优化技巧
# 滁州推广网站优化团队
# 可以使用
# 不存在
# python
# 又是
# 迭代
# 列表中
# 都为
# 数据结构
# 转换为
# red
# 配置文件
# 工具
# app
# json
# js
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践
深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现
中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】
可靠CSGO开箱平台解析 CSGO开箱网合集
QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口
Golang如何使用const iota_Go iota常量计数器讲解
在Typer应用中优雅地处理和重组任意命令行参数
蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】
谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问
谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
夸克浏览器图书入口 夸克手机浏览器阅读入口
使用J*aScript检测输入元素是否包含在特定类中
QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网
vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法
特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相
如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率
UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】
探索高级语言到原生C/C++的转译:挑战与内存管理策略
百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案
CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色
Linux如何构建多环境配置管理_Linux多环境配置方案
快手网页版在线登录 快手网页版官网入口快速访问
从OpenAI API响应中高效提取生成文本
age动漫网站入口 age动漫官网直接访问入口
必由学官网入口 必由学教师登录入口
单射、满射与双射的关系 一文理清所有逻辑
composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?
sublime怎么设置启动时打开的窗口_sublime会话管理与热退出
C++如何比较两个字符串_C++ string compare函数与操作符对比
poki网页游戏推荐_poki免费游戏平台入口
Angular响应式表单:实现提交后表单及按钮的禁用与只读化
Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持
京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比
在J*aScript中复现SciPy的B样条拟合与求值:关键考量
C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法
知音漫客正版漫画平台_知音漫客官网账号登录
手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议
Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
Log4j Console Appender性能瓶颈与高并发优化策略
UC浏览器官网入口2025最新 UC浏览器网页版正式地址
sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE
如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension
Python Socket多播通信中指定源IP地址的实践指南
PHP中SSG-WSG API的AES加密实践:正确使用初始化向量
c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析
C++指针和引用有什么区别_C++内存管理核心概念深度解析
解决Bootstrap卡片顶部边距导致背景图下移的问题
Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】


2025-11-30
浏览次数:次
返回列表