
在处理JSON等半结构化数据时,我们经常会遇到多层嵌套的列表(List)和字典(Dictionary)混合结构。理解这些结构是正确访问其中数据的关键。
当列表和字典相互嵌套时,我们需要根据当前元素的类型,选择正确的访问方式。
以提供的JSON数据片段为例:
{
"liveData": {
"plays": {
"allPlays": [
{
"runners": [
{
"details": {
"event": "Single",
"runner": {
"id": 656941,
"fullName": "Kyle Schwarber"
}
}
}
]
}
]
}
}
}要访问 id 值,我们需要逐步深入这个结构。
立即学习“Python免费学习笔记(深入)”;
许多开发者在处理这种嵌套数据时常犯的一个错误是,试图用字典键的方式去访问列表元素,或者反之。例如,原始问题中尝试 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。
正确的访问路径应该是:
以下是一个完整的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,建议采取以下策略:
上述示例代码中,第二个部分展示了如何结合 for 循环和 dict.get() 来遍历并安全地访问所有可能的 runner ID。
原始问题中提到了 json_normalize。json_normalize 是 pandas 库中的一个函数,主要用于将半结构化的JSON数据扁平化(flatten)为二维表格(DataFrame)格式,这对于数据分析非常有用。它可以自动处理嵌套的列表和字典,将其展开为列。
然而,对于本教程中讨论的特定问题——即精确地从一个已知路径中提取单个或少数几个深层嵌套值——直接使用Python的字典和列表索引操作通常更直接、高效且易于理解。json_normalize 更适用于需要将整个复杂JSON结构转换为表格进行大规模分析的场景,而不是简单的单值提取。
掌握Python中列表和字典的嵌套访问是处理复杂数据结构的基础。核心原则是:当遇到方括号 [] 时,它表示一个列表,需要使用整数索引;当遇到花括号 {} 时,它表示一个字典,需要使用字符串键。通过逐层深入并结合循环和错误处理机制,你可以高效、准确且健壮地从任何深度嵌套的数据中提取所需的信息。
以上就是掌握Python中嵌套列表与字典的数据访问技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号