0

0

Python中深度嵌套字典与列表的数据提取与条件过滤指南

花韻仙語

花韻仙語

发布时间:2025-11-29 10:07:06

|

768人浏览过

|

来源于php中文网

原创

Python中深度嵌套字典与列表的数据提取与条件过滤指南

本教程旨在详细讲解如何在python中处理复杂的深度嵌套字典和列表数据结构。我们将通过一个实际案例,演示如何有效地遍历多层数据,提取特定字段(如`asset`、`free`、`locked`),并应用条件过滤(例如,排除`free`和`locked`字段均为'0'的条目),最终构建出符合需求的结果集。

在现代数据处理中,我们经常会遇到来自API响应、配置文件或日志等来源的复杂数据结构,它们通常以JSON格式呈现,并在Python中表现为嵌套的字典和列表。有效地从这些结构中提取所需信息并进行过滤,是数据处理的核心技能之一。

数据结构概览

假设我们有以下Python字典数据,其中包含多层嵌套的列表和字典:

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。

目标:提取与过滤

我们的目标是从上述repo字典中提取balances列表中的所有条目,但需要满足以下两个条件:

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

  1. 获取每个条目的asset、free和locked字段的值。
  2. 过滤掉那些free和locked字段值均为'0'的条目。

最终结果应是一个列表,其中包含符合条件的资产余额信息。

逐步解析与实现

为了实现上述目标,我们需要逐层深入数据结构,并应用适当的循环和条件判断。

1. 遍历 snapshotVos 列表

首先,我们需要访问repo字典中的snapshotVos键,它是一个列表。由于这个列表可能包含多个元素(尽管我们的示例中只有一个),我们需要一个循环来遍历它。

rows1 = [] # 用于存储最终结果的列表
for item in repo['snapshotVos']:
    # 在这里处理每个item
    pass

2. 访问 data 和 balances

在snapshotVos列表的每个item中,我们感兴趣的数据位于item['data']['balances']。balances本身又是一个列表,其中包含多个资产字典。

rows1 = []
for item in repo['snapshotVos']:
    data_content = item['data']
    balances_list = data_content['balances']
    # 现在,balances_list 是一个包含资产字典的列表
    pass

3. 遍历 balances 列表并应用过滤条件

现在我们有了balances_list,我们需要再次使用循环来遍历其中的每一个资产字典(我们称之为balance)。在每次迭代中,我们将应用过滤条件。

rows1 = []
for item in repo['snapshotVos']:
    for balance in item['data']['balances']:
        # 检查过滤条件:如果 'free' 和 'locked' 字段不都为 '0'
        if not (balance['free'] == '0' and balance['locked'] == '0'):
            # 提取所需的值
            # 原始问题要求“获取键从 'asset', 'free', 'locked'”,
            # 答案提供的是这些键的值列表。
            # 如果需要的是值列表:
            val = [balance['asset'], balance['free'], balance['locked']]

            # 如果需要的是一个包含这些键值对的字典:
            # val = {'asset': balance['asset'], 'free': balance['free'], 'locked': balance['locked']}

            # 确保不添加重复的条目 (如果需要去重)
            if val not in rows1:
                rows1.append(val)

关于去重说明: 原始答案中的if val not in rows1: 是为了确保最终结果列表中不包含重复的条目。如果数据源本身保证不重复,或者允许重复,则可以省略此检查以提高效率。

ColorMagic
ColorMagic

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
        },
        # 假设 snapshotVos 中可能有更多元素,或者 balances 中有重复项
        {
            'data': {
                'balances': [
                    {'asset': 'ADD', 'free': '10', 'locked': '0'}, # 这是一个重复项
                    {'asset': 'BTC', 'free': '0.5', 'locked': '0.1'}
                ],
                'totalAsset': '200'
            },
            'type': 'margin',
            'updateTime': 1703808000000
        }
    ]
}

rows1 = [] # 用于存储最终结果的列表

for item in repo['snapshotVos']:
    for balance in item['data']['balances']:
        # 检查过滤条件:如果 'free' 和 'locked' 字段不都为 '0'
        if not (balance['free'] == '0' and balance['locked'] == '0'):
            # 提取 'asset', 'free', 'locked' 的值作为一个列表
            # 如果你希望得到一个字典,可以改为:
            # val = {'asset': balance['asset'], 'free': balance['free'], 'locked': balance['locked']}
            val = [balance['asset'], balance['free'], balance['locked']]

            # 检查是否已存在,避免重复添加
            if val not in rows1:
                rows1.append(val)

print(rows1)

结果分析

运行上述代码,将得到如下输出:

[['ADD', '10', '0'], ['SHIB', '0', '947415'], ['BTC', '0.5', '0.1']]

从输出中可以看到:

  • ['ADD', '10', '0'] 被包含,因为它虽然locked为'0',但free不为'0'。
  • ['RDP', '0', '0'] 被排除,因为其free和locked均为'0'。
  • ['SHIB', '0', '947415'] 被包含。
  • ['BTC', '0.5', '0.1'] 被包含。
  • 重复的['ADD', '10', '0']只出现了一次,这得益于if val not in rows1:的去重逻辑。

注意事项与进阶技巧

1. 处理缺失键

在实际数据中,字典的键可能不是每次都存在。为了避免KeyError,可以使用字典的get()方法提供默认值,或者使用try-except块。

# 使用 .get() 方法
asset = balance.get('asset', 'N/A')
free = balance.get('free', '0') # 如果键不存在,默认为 '0'
locked = balance.get('locked', '0')

2. 返回字典而非值列表

如果希望结果列表中的每个元素是一个字典,而不是值的列表,可以修改val的构建方式:

# ... (循环部分相同)
if not (balance.get('free', '0') == '0' and balance.get('locked', '0') == '0'):
    val = {
        'asset': balance.get('asset'),
        'free': balance.get('free'),
        'locked': balance.get('locked')
    }
    if val not in rows1: # 注意:字典的去重比较复杂,可能需要自定义逻辑
        rows1.append(val)

如果返回字典,if val not in rows1: 的去重逻辑可能需要更精细的实现,因为字典的相等性比较是基于键值对的。

3. 使用列表推导式简化代码

对于这种提取和过滤操作,Python的列表推导式(List Comprehension)可以使代码更简洁、更具可读性:

rows1_comprehension = [
    [balance['asset'], balance['free'], balance['locked']]
    for item in repo['snapshotVos']
    for balance in item['data']['balances']
    if not (balance['free'] == '0' and balance['locked'] == '0')
]
# 注意:列表推导式默认不会去重。如果需要去重,可以转换为set再转回list,
# 或者使用更复杂的推导式结合set。
# 例如,如果需要去重并保持顺序,可以这样做:
seen = set()
unique_rows1 = []
for row in rows1_comprehension:
    if tuple(row) not in seen: # 列表不能直接放入set,需要转换为不可变的tuple
        seen.add(tuple(row))
        unique_rows1.append(row)

print(unique_rows1)

4. 类型转换

请注意,示例数据中的free和locked值是字符串(例如'10'、'0')。如果需要进行数值比较或计算,务必将其转换为整数或浮点数。

# 过滤条件可以改为数值比较
# if not (int(balance.get('free', '0')) == 0 and int(balance.get('locked', '0')) == 0):

在进行类型转换前,务必确保字符串可以安全地转换为数字,否则可能引发ValueError。

总结

从嵌套的Python字典和列表中提取和过滤数据是日常编程中的常见任务。通过理解数据结构、运用嵌套循环和条件判断,我们可以精确地定位并处理所需的数据。列表推导式提供了一种更Pythonic、更简洁的解决方案。在实际应用中,还需考虑键的缺失、数据类型转换以及去重等问题,以确保代码的健壮性和准确性。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

455

2023.08.07

json是什么
json是什么

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

546

2023.08.23

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

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

334

2023.10.13

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

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

82

2025.09.10

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

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

337

2023.10.31

php数据类型
php数据类型

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

224

2025.10.31

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

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

138

2026.02.12

if什么意思
if什么意思

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

846

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课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

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

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