当前位置:首页 > 文章列表 > 文章 > python教程 > Python嵌套列表字典怎么访问

Python嵌套列表字典怎么访问

2025-08-29 15:57:48 0浏览 收藏

本文深入解析Python中处理嵌套列表和字典的技巧,尤其是在面对多层JSON数据时。针对开发者常犯的错误,如混淆列表索引和字典键,文章通过实例详细阐述了如何使用正确的索引方式逐层访问深层数据。从顶层字典开始,逐步深入到列表和字典的嵌套结构,最终精准提取目标值。同时,提供了使用`dict.get()`方法和`try-except`块处理数据缺失的健壮性建议。此外,还简述了`json_normalize`的适用场景,强调其更适用于大规模数据分析,而非简单的单值提取,旨在帮助开发者高效、准确地处理复杂数据结构。

掌握Python中嵌套列表与字典的数据访问技巧

本文详细介绍了在Python中如何高效且准确地访问复杂嵌套数据结构(特别是包含列表和字典的多层JSON数据)中的特定值。通过具体示例,文章解释了直接索引列表元素和字典键的正确方法,避免了常见的类型错误,并提供了处理多条记录和潜在数据缺失的健壮性建议,旨在帮助开发者熟练提取深层数据。

理解嵌套数据结构

在处理JSON等半结构化数据时,我们经常会遇到多层嵌套的列表(List)和字典(Dictionary)混合结构。理解这些结构是正确访问其中数据的关键。

  • 字典(Dictionary):由键值对组成,通过键(字符串)来访问其对应的值。例如:{"key": "value"},访问方式为 data["key"]。
  • 列表(List):由一系列有序的元素组成,通过索引(整数)来访问其对应位置的元素。例如:["item1", "item2"],访问方式为 data[0]。

当列表和字典相互嵌套时,我们需要根据当前元素的类型,选择正确的访问方式。

以提供的JSON数据片段为例:

{
  "liveData": {
    "plays": {
      "allPlays": [
        {
          "runners": [
            {
              "details": {
                "event": "Single",
                "runner": {
                  "id": 656941,
                  "fullName": "Kyle Schwarber"
                }
              }
            }
          ]
        }
      ]
    }
  }
}

要访问 id 值,我们需要逐步深入这个结构。

常见错误分析与正确访问方法

许多开发者在处理这种嵌套数据时常犯的一个错误是,试图用字典键的方式去访问列表元素,或者反之。例如,原始问题中尝试 x = play['runners']['details'] 时,会遇到 'details' is not an acceptable index since it is a string and not an integer or a slice 的错误。

这是因为 play['runners'] 是一个列表([...]),而不是一个字典。列表不能通过字符串键来访问,它只能通过整数索引来访问其内部元素。在这个特定的数据结构中,runners 列表包含一个字典元素。因此,我们首先需要通过索引 [0] 来获取列表中的第一个(也是唯一一个)字典元素,然后才能继续使用键来访问其内部的 details。

正确的访问路径应该是:

  1. data["liveData"]:从顶层字典获取 liveData 字典。
  2. data["liveData"]["plays"]:从 liveData 字典获取 plays 字典。
  3. data["liveData"]["plays"]["allPlays"]:从 plays 字典获取 allPlays 列表。
  4. data["liveData"]["plays"]["allPlays"][0]:从 allPlays 列表获取第一个元素,它是一个字典。
  5. data["liveData"]["plays"]["allPlays"][0]["runners"]:从上一步获取的字典中获取 runners 列表。
  6. data["liveData"]["plays"]["allPlays"][0]["runners"][0]:从 runners 列表获取第一个元素,它又是一个字典。
  7. data["liveData"]["plays"]["allPlays"][0]["runners"][0]["details"]:从上一步获取的字典中获取 details 字典。
  8. data["liveData"]["plays"]["allPlays"][0]["runners"][0]["details"]["runner"]:从 details 字典中获取 runner 字典。
  9. data["liveData"]["plays"]["allPlays"][0]["runners"][0]["details"]["runner"]["id"]:最终从 runner 字典中获取 id 的值。

示例代码

以下是一个完整的Python代码示例,演示如何加载JSON数据并正确地访问嵌套的 id 值:

import json

# 模拟从文件中读取的JSON数据
json_data = """
{
  "liveData": {
    "plays": {
      "allPlays": [
        {
          "runners": [
            {
              "details": {
                "event": "Single",
                "runner": {
                  "id": 656941,
                  "fullName": "Kyle Schwarber"
                },
                "responsiblePitcher": null,
                "isScoringEvent": false,
                "rbi": false,
                "earned": false,
                "teamUnearned": false,
                "playIndex": 6
              }
            }
          ]
        }
      ]
    }
  }
}
"""

# 将JSON字符串解析为Python字典
data = json.loads(json_data)

# 按照正确的路径访问 'id' 值
try:
    id_value = data["liveData"]["plays"]["allPlays"][0]["runners"][0]["details"]["runner"]["id"]
    print(f"成功获取ID: {id_value}")
except (KeyError, IndexError) as e:
    print(f"访问数据时发生错误: {e}. 请检查路径或数据结构是否符合预期。")

# 示例:如果需要处理多个runner或allPlays
# 假设allPlays中可能有多个play,每个play可能有多个runner
print("\n--- 遍历所有runner的ID ---")
all_plays = data.get("liveData", {}).get("plays", {}).get("allPlays", [])

for play_index, play in enumerate(all_plays):
    runners = play.get("runners", [])
    for runner_index, runner_data in enumerate(runners):
        details = runner_data.get("details", {})
        runner_info = details.get("runner", {})
        runner_id = runner_info.get("id")
        if runner_id is not None:
            print(f"Play[{play_index}] -> Runner[{runner_index}] ID: {runner_id}")
        else:
            print(f"Play[{play_index}] -> Runner[{runner_index}] 未找到ID或数据结构不完整。")

处理多条记录与健壮性

在实际应用中,allPlays 列表或 runners 列表可能包含多个元素,而不仅仅是第一个。为了提取所有相关数据,你需要使用循环(如 for 循环)来遍历这些列表。

此外,为了使代码更加健壮,防止因数据缺失(例如某个键不存在或列表为空)而引发 KeyError 或 IndexError,建议采取以下策略:

  1. 使用 dict.get() 方法:当访问字典中的键时,使用 dict.get(key, default_value) 可以避免 KeyError。如果键不存在,它将返回 default_value(默认为 None),而不是抛出错误。
  2. 检查列表长度或使用 try-except:在访问列表元素前,可以检查列表是否为空或索引是否越界。更通用的做法是使用 try-except 块来捕获 KeyError 和 IndexError,从而优雅地处理数据缺失的情况。

上述示例代码中,第二个部分展示了如何结合 for 循环和 dict.get() 来遍历并安全地访问所有可能的 runner ID。

json_normalize 的适用场景(简述)

原始问题中提到了 json_normalize。json_normalize 是 pandas 库中的一个函数,主要用于将半结构化的JSON数据扁平化(flatten)为二维表格(DataFrame)格式,这对于数据分析非常有用。它可以自动处理嵌套的列表和字典,将其展开为列。

然而,对于本教程中讨论的特定问题——即精确地从一个已知路径中提取单个或少数几个深层嵌套值——直接使用Python的字典和列表索引操作通常更直接、高效且易于理解。json_normalize 更适用于需要将整个复杂JSON结构转换为表格进行大规模分析的场景,而不是简单的单值提取。

总结

掌握Python中列表和字典的嵌套访问是处理复杂数据结构的基础。核心原则是:当遇到方括号 [] 时,它表示一个列表,需要使用整数索引;当遇到花括号 {} 时,它表示一个字典,需要使用字符串键。通过逐层深入并结合循环和错误处理机制,你可以高效、准确且健壮地从任何深度嵌套的数据中提取所需的信息。

今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

Word主题颜色怎么设置?Word主题颜色怎么设置?
上一篇
Word主题颜色怎么设置?
随机展示指定数量的轮播图Slides
下一篇
随机展示指定数量的轮播图Slides
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 千音漫语:智能声音创作助手,AI配音、音视频翻译一站搞定!
    千音漫语
    千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
    420次使用
  • MiniWork:智能高效AI工具平台,一站式工作学习效率解决方案
    MiniWork
    MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
    419次使用
  • NoCode (nocode.cn):零代码构建应用、网站、管理系统,降低开发门槛
    NoCode
    NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
    416次使用
  • 达医智影:阿里巴巴达摩院医疗AI影像早筛平台,CT一扫多筛癌症急慢病
    达医智影
    达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
    433次使用
  • 智慧芽Eureka:更懂技术创新的AI Agent平台,助力研发效率飞跃
    智慧芽Eureka
    智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
    450次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码