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


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列表中的所有条目,但需要满足以下两个条件:

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

完整代码示例

将上述步骤整合,得到完整的解决方案代码:

Viggle AI Video Viggle AI Video

Powerful AI-powered animation tool and image-to-video AI generator.

Viggle AI Video 115 查看详情 Viggle AI Video
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中深度嵌套字典与列表的数据提取与条件过滤指南的详细内容,更多请关注其它相关文章!


# 其中包含  # 济南短视频营销推广公司  # seo证据链排行  # 温州网站建设建议怎么写  # 江西专业推广软件网站  # 单页面推广网站模版  # 去哪儿网网络营销与推广  # 商业推广素材网站  # 搜狗seo排名优化  # 手机行业营销推广费  # 北京移动端关键词排名  # 所需  # 均为  # 转换为  # python  # 的是  # 多个  # 遍历  # 是一个  # 数据结构  # AI-powered  # btc  # 键值对  # 配置文件  # app  # json  # js 


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


相关推荐: win11关机几秒又自己开机 Win11关机自动重启问题修复  铁路12306官网登录入口 铁路12306在线购票官方平台  TikTok私信无法发送表情怎么办 TikTok消息表情发送修复方法  windows10怎么开启wsl_windows10安装linux子系统教程  如何在CSS中设置背景图像:一个全面指南  智学网成绩单查询系统网_智学网学生平台登录  iPhone 13 mini如何清理Safari缓存_iPhone 13 mini浏览器缓存清理方法  cad怎么隐藏指定的图层_cad隐藏或冻结图层方法  《小宇宙》标记不友善评论方法  Golang如何使用crypto/md5生成哈希_Golang MD5哈希生成方法  微信网页版在线登录 微信网页版在线使用入口  J*a里如何处理ArithmeticException并防止除零_算术异常防护策略解析  菜鸟裹裹怎样获得取件码_菜鸟裹裹获得取件码步骤  《KARDS》冬季扩展包“国土阵线”上线!全新“协力”机制改变战场格局  CSS绝对定位与溢出控制:实现背景元素局部显示不触发滚动条  曝《丝之歌》DLC有望开发!开发商还有神秘新企划  掌握CSS :has() 选择器:父选择器、嵌套限制与常见陷阱解析  sublime text 4如何安装_最新版sublime下载与汉化教程  《随手记》备份数据方法  Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南  Flash AS3.0简易相册制作  Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧  CSS动画如何实现图标旋转并放大_transform rotate scale @keyframes实现  QQ邮箱官方登录页_腾讯出品安全稳定的邮箱服务  抖音号升级成企业资质怎么弄?有什么好处?  雨课堂官网在线登录 网页版雨课堂登录链接  PHP动态导航按钮:根据用户登录状态切换链接与文本  使用VS Code作为你的个人知识管理系统  空腹吃苹果好吗 苹果空腹摄入指南  sf漫画官网登录入口直达_sf漫画官方正版网址  太平年在哪个平台播出  抖音网页版地址直接进入_抖音网页版在线观看入口  如何在vscode中关闭it环境  苹果手机如何清理系统缓存数据 iPhone非越狱清理垃圾文件的技巧【系统优化】  Sublime怎么自动添加CSS前缀_Sublime安装Autoprefixer插件  快手极速版在线体验区 快手极速版网页体验入口  猫眼电影app如何设置电影上映提醒_猫眼电影上映提醒设置教程  《王者荣耀世界》英雄获取攻略  mysql如何管理数据库账户_mysql数据库账户管理技巧  《磁力猫》最好用的磁官网  CSS过渡如何实现按钮悬停效果_transition属性控制背景颜色变化  Golang如何实现HTTP请求重试机制_Golang HTTP请求错误处理策略  歌词怎么展示在|直播|间视频号?有什么注意事项?  小红书网页版在线直达 小红书网页版免费登录入口  Fedora怎么安装 Fedora Workstation安装步骤  Flask 应用中图片动态更新与上传:实现客户端定时刷新与服务器端文件管理  抖音评论无法发送如何修复 抖音评论功能操作指南  Flexbox布局实践:实现底部页脚与顶部粘性导航条的完美结合  漫蛙manwa2网页版书签同步链接_漫蛙manwa多设备登录入口  Django模型动态关联检查:高效管理复杂关系 

 2025-11-29

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

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

点击免费数据支持

提交您的需求,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.