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


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 列表,我们需要按照其层级结构逐步深入。

  1. 访问 snapshotVos 列表: repo['snapshotVos']
  2. 迭代 snapshotVos 列表中的每个字典: 使用 for 循环。
  3. 从每个字典中访问 data 键: re['data']
  4. 从 data 字典中访问 balances 列表: re['data']['balances']
  5. 迭代 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. 完整代码示例

将上述所有步骤整合起来,形成完整的解决方案:

百度文心百中 百度文心百中

百度大模型语义搜索体验中心

百度文心百中 251 查看详情 百度文心百中
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中处理嵌套字典与列表数据:提取与条件过滤教程的详细内容,更多请关注其它相关文章!


# 浮点  # 湖北网站建设开发价格  # 东莞网站建设哪家快  # seo优化程序  # 宠物网站建设  # 信阳网站建设讯息  # 深圳网站建设服务电话  # 桐乡营销推广报价  # 闲鱼搜索女装关键词排名  # 武穴市seo关键词排名优化报价  # 东兴网站建设开发全国接单  # 百中  # 遍历  # python  # 又是  # 迭代  # 列表中  # 都为  # 数据结构  # 转换为  # red  # 配置文件  # 工具  # app  # json  # js 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 泰拉瑞亚水晶无法放置问题  12306不能订票的时间段是固定的吗? | 节假日购票时间有无变化  研招网官方网站正版登录网址_中国研究生招生信息网官网首页  mysql归档数据怎么导出为csv_mysql归档数据导出为csv文件的方法  《我的恋爱逃生攻略》中文名字输入方法  除了Copilot,还有哪些值得一试的VS Code AI插件?  西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法  电脑视频号|直播|如何分享屏幕  mysql如何回滚事务_mysql ROLLBACK事务回滚方法  J*a中为什么强调组合优于继承_组合模式带来的灵活性与可维护性解析  使用CSS :has() 选择器实现父元素样式控制:从子元素反向应用样式  什么是Satis,如何用它搭建一个私有的composer仓库?  Composer reinstall命令重装损坏的包  支付宝登录刷脸不是本人如何解决  暴风影音官网正式版_暴风影音手机版官网下载安卓  漫蛙漫画官方版直通入口 2025漫蛙漫画免注册访问说明  win11关机几秒又自己开机 Win11关机自动重启问题修复  海棠阅读网页版_进入海棠网页版在线阅读中心  漫蛙app官方版手机正版入口-漫蛙漫画manwa在线漫画正版入口  163邮箱网页版入口 163邮箱在线使用  《KARDS》冬季扩展包“国土阵线”上线!全新“协力”机制改变战场格局  Linux如何自动分析系统异常日志_Linux日志智能检测  Flexbox布局实践:实现底部页脚与顶部粘性导航条的完美结合  解决VS Code中Python版本冲突与输出异常的指南  深入理解Python对象引用与链表属性赋值  传统曲艺莲花落的表演形式是  漫蛙manwa漫画官网链接_漫蛙manwa最新可用网址推荐  猫眼app抢票快还是小程序快  顺丰快递单号查询寄件人 顺丰寄件人查询入口  汽水音乐官方网站登录入口_汽水音乐网页版进入链接  外卖小程序对接第三方配送  深入理解J*aScript异步操作:setTimeout与调用栈的真相  《暗黑破坏神4》国服回归送狂欢礼包 价值6916元  QQ邮箱官方登录页_腾讯出品安全稳定的邮箱服务  Sublime怎么配置YAML文件格式化_Sublime YAML Formatter插件教程  Python测试中模块导入路径解析的最佳实践  msn官方入口2025登录 msn官网2025直达首页入口  J*a列表元素格式化输出教程  Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南  在PySimpleGUI中实现键盘按键绑定按钮事件  苹果手机如何清理系统缓存数据 iPhone非越狱清理垃圾文件的技巧【系统优化】  国际经济与贸易就业方向解析  晓晓优选app支付宝绑定方法  Excel如何设置动态下拉菜单_Excel表格下拉选项快速方法  win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】  J*aScript类型数组_TypedArray使用  附近酒吧怎么找?  海外搜索引擎推广效果怎么样,怎么分析效果!  Go反射进阶:访问内嵌结构体中的被遮蔽方法  Win10怎么设置快速启动 Win10开启快速启动设置方法 

 2025-11-30

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.