0

0

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

聖光之護

聖光之護

发布时间:2025-11-30 12:02:01

|

268人浏览过

|

来源于php中文网

原创

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' 的条目。

立即学习Python免费学习笔记(深入)”;

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. 完整代码示例

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

Magic AI Avatars
Magic AI Avatars

神奇的AI头像,获得200多个由AI制作的自定义头像。

下载
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特性(如列表推导式)来提高代码的可读性和效率至关重要。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

547

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

338

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

225

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号