本教程详细讲解如何在python中处理复杂的嵌套字典与列表数据结构。我们将学习如何层层深入访问特定数据,迭代列表中的字典,并应用条件逻辑对数据进行过滤和提取,最终生成符合要求的结果集。
在现代数据处理中,我们经常会遇到结构复杂、多层嵌套的数据,尤其是在处理API响应或配置文件时。Python的字典(dictionary)和列表(list)是处理这类数据的核心工具。本教程将以一个具体的案例为例,演示如何从一个包含字典和列表的嵌套结构中,提取特定信息并根据条件进行过滤。
首先,我们来看一个典型的嵌套数据结构示例:
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 字典包含以下层级:
我们的目标是从 balances 列表中提取数据,并过滤掉那些 free 和 locked 值都为 '0' 的条目。
要访问 balances 列表,我们需要按照其层级结构逐步深入。
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'} 这样的字典
# ... 在这里进行过滤和提取操作根据需求,我们需要移除那些 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,该条目被处理。
在满足过滤条件的条目中,我们需要提取其值。根据原始问题的意图,我们可能需要将每个 balance_entry 字典的值转换为一个列表,并确保结果列表中不包含重复的条目。
val = list(balance_entry.values()) # 将字典的值转换为列表,例如 ['ADD', '10', '0']
if val not in rows1: # 检查该值列表是否已存在于结果集中,避免重复
rows1.append(val)将上述所有步骤整合起来,形成完整的解决方案:
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' 而被成功过滤掉了。
健壮性处理: 在实际应用中,数据结构可能不总是完美的。例如,某个字典可能缺少 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
# js
# json
# app
# 工具
# 配置文件
# red
相关文章:
如何在建站之星绑定自定义域名?
建站主机系统SEO优化与智能配置核心关键词操作指南
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何在Windows服务器上快速搭建网站?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
建站主机类型有哪些?如何正确选型
小型网站建站如何选择虚拟主机?
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
建站主机无法访问?如何排查域名与服务器问题
上海网站制作开发公司,上海买房比较好的网站有哪些?
如何解决VPS建站LNMP环境配置常见问题?
Java解压缩zip - 解压缩多个文件或文件夹实例
武清网站制作公司,天津武清个人营业执照注销查询系统网站?
孙琪峥织梦建站教程如何优化数据库安全?
活动邀请函制作网站有哪些,活动邀请函文案?
网站制作壁纸教程视频,电脑壁纸网站?
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
大型企业网站制作流程,做网站需要注册公司吗?
如何在建站主机中优化服务器配置?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
如何选择可靠的免备案建站服务器?
如何在IIS中配置站点IP、端口及主机头?
,巨量百应是干嘛的?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
大连 网站制作,大连天途有线官网?
建站之星在线版空间:自助建站+智能模板一键生成方案
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
音乐网站服务器如何优化API响应速度?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
安云自助建站系统如何快速提升SEO排名?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
移民网站制作流程,怎么看加拿大移民官网?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
建站之星2.7模板快速切换与批量管理功能操作指南
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何快速搭建高效服务器建站系统?
专业公司网站制作公司,用什么语言做企业网站比较好?
北京制作网站的公司,北京铁路集团官方网站?
如何快速生成橙子建站落地页链接?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
婚礼视频制作网站,学习*后期制作的网站有哪些?
如何在建站之星网店版论坛获取技术支持?
简单实现Android文件上传
建站与域名管理如何高效结合?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
网站制作企业,网站的banner和导航栏是指什么?
深入理解Android中的xmlns:tools属性
c++怎么用jemalloc c++替换默认内存分配器【性能】
设计网站制作公司有哪些,制作网页教程?
*请认真填写需求信息,我们会在24小时内与您取得联系。