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: 是为了确保最终结果列表中不包含重复的条目。如果数据源本身保证不重复,或者允许重复,则可以省略此检查以提高效率。

Bolt.new
Bolt.new

Bolt.new是一个免费的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、更简洁的解决方案。在实际应用中,还需考虑键的缺失、数据类型转换以及去重等问题,以确保代码的健壮性和准确性。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

757

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

636

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

761

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1264

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

548

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

708

2023.08.11

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.16

热门下载

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

精品课程

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

共4课时 | 2万人学习

Django 教程
Django 教程

共28课时 | 3.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

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

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