Python处理列表套字典结构JSON数据的三种方式对比

 更新时间:2026年02月28日 09:31:40   作者:大游小游之老游  
这篇文章主要为大家详细介绍了Python处理JSON文件中列表套字典结构的三种优化方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

前言

对于 “列表套字典”(JSON 数组包含对象)类型的 JSON 文件,查找并修改特定键值的思路是:先遍历列表中的每个字典,找到符合条件的目标字典,再修改该字典中指定键的值,最后写回文件。

示例场景

假设 users.json 文件内容如下(列表套字典结构):

[
  {"id": 1, "name": "Alice", "age": 25, "active": true},
  {"id": 2, "name": "Bob", "age": 30, "active": false},
  {"id": 3, "name": "Charlie", "age": 28, "active": true}
]

需求

找到 id=2 的字典,将其 age 修改为 31,同时将 active 改为 true

import json

# 1. 读取 JSON 文件(列表套字典结构,解析后是 Python 列表)
with open("users.json", "r", encoding="utf-8") as f:
    data_list = json.load(f)  # data_list 是一个包含字典的列表

# 2. 遍历列表,查找目标字典并修改值
for item in data_list:
    # 假设通过 "id" 定位目标字典(可根据实际条件调整)
    if item.get("id") == 2:  # 找到 id=2 的字典
        item["age"] = 31  # 修改 age 的值
        item["active"] = True  # 修改 active 的值
        break  # 找到后退出循环,提高效率

# 3. 将修改后的列表写回 JSON 文件
with open("users.json", "w", encoding="utf-8") as f:
    json.dump(data_list, f, indent=2, ensure_ascii=False)

潜在问题及优化方案

在处理 “列表套字典” 结构的 JSON 数据时,遍历列表是最直接的方式,但对于数据量极大的场景(如几万 / 几十万条数据),遍历的效率确实可能偏低。此时可以通过优化查找逻辑借助第三方库提升效率,具体方法如下:

方法 1:用 “字典映射” 预处理,将列表转为索引字典(推荐)

 如果列表中的字典有唯一标识键(如id),可以先将列表转换为以该标识为键的字典(相当于建立 “索引”),后续查找时直接通过键获取目标字典,时间复杂度从遍历的O(n)降至O(1)

示例(基于之前的users.json):

import json

# 1. 读取数据并构建索引字典(以id为键)
with open("users.json", "r", encoding="utf-8") as f:
    data_list = json.load(f)

# 构建映射:{id: 对应的字典}
id_to_item = {item["id"]: item for item in data_list}

# 2. 直接通过id查找并修改(无需遍历)
target_id = 2
if target_id in id_to_item:
    id_to_item[target_id]["age"] = 31
    id_to_item[target_id]["active"] = True

# 3. 写回文件(原列表已被修改,因为字典是引用类型)
with open("users.json", "w", encoding="utf-8") as f:
    json.dump(data_list, f, indent=2, ensure_ascii=False)

优势

  • 预处理一次后,后续多次查找 / 修改均为O(1),适合频繁操作的场景。
  • 不改变原列表结构,写回文件时直接用原列表即可(因为字典是引用类型,修改映射中的字典会同步影响原列表)。

方法 2:用列表推导式 / 生成器表达式简化查找(适合单次查找)

如果只需单次查找,可通过列表推导式或生成器表达式快速定位目标,代码更简洁(本质仍是遍历,但写法更高效)。

示例:

import json

with open("users.json", "r", encoding="utf-8") as f:
    data_list = json.load(f)

# 用生成器表达式查找第一个符合条件的字典(找到即停止)
target = next((item for item in data_list if item["id"] == 2), None)
if target:
    target["age"] = 31
    target["active"] = True

with open("users.json", "w", encoding="utf-8") as f:
    json.dump(data_list, f, indent=2, ensure_ascii=False)

优势

  • 借助next()和生成器表达式,找到目标后会立即停止遍历(类似带break的循环),避免多余操作。
  • 代码更简洁,适合一次性查询修改。

方法 3:借助第三方库(如pandas)处理结构化数据

如果 JSON 数据是结构化的(如每个字典的键相同,类似表格),可以用pandas将其转为 DataFrame,通过类似 SQL 的查询语法快速定位和修改,适合大数据量场景。

示例:

import json
import pandas as pd

# 1. 读取JSON并转为DataFrame
with open("users.json", "r", encoding="utf-8") as f:
    data_list = json.load(f)
df = pd.DataFrame(data_list)

# 2. 定位并修改(通过条件筛选)
df.loc[df["id"] == 2, ["age", "active"]] = [31, True]

# 3. 转回列表并写回文件
updated_list = df.to_dict("records")  # 转为列表套字典
with open("users.json", "w", encoding="utf-8") as f:
    json.dump(updated_list, f, indent=2, ensure_ascii=False)

优势

  • pandas底层用 C 实现,处理大数据量(如 10 万 + 条)时效率远高于纯 Python 遍历。
  • 支持复杂条件查询(如多键组合筛选),语法更直观。

注意:需要安装pandaspip install pandas),适合数据结构化程度高的场景。

总结:如何选择

  • 小数据量(几百条以内):直接遍历或生成器表达式即可,代码简单,效率差异可忽略。
  • 大数据量 + 有唯一标识:优先用 “字典映射” 预处理,单次预处理O(n),后续操作O(1),性价比最高。
  • 大数据量 + 结构化数据:用pandas,适合需要频繁进行复杂查询和修改的场景。

本质上,除了建立索引(方法 1)和借助底层优化的库(方法 3),其他方式仍依赖遍历,但通过 “提前终止”(如breaknext())可减少无效操作,效率差异主要体现在数据量极大的场景中。

到此这篇关于Python处理列表套字典结构JSON数据的三种方式对比的文章就介绍到这了,更多相关Python处理JSON数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 矩阵增加一行或一列的实例

    python 矩阵增加一行或一列的实例

    下面小编就为大家分享一篇python 矩阵增加一行或一列的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • 教你用Python实现一个轮盘抽奖小游戏

    教你用Python实现一个轮盘抽奖小游戏

    Python提供了许多个图像开发界面的库,比如现在主流的Tkinter,wxPython,pyqt5等,三种各有优点,也各有缺点,下面对其分别进行介绍和对比,并编写代码实现一个轮盘转盘抽奖小游戏.需要的朋友可以参考下
    2021-05-05
  • 使用Python和Selenium构建一个自动化图像引擎

    使用Python和Selenium构建一个自动化图像引擎

    这篇文章主要为大家详细介绍了如何使用Python和Selenium库构建一个自动化图像引擎,能够根据指定参数自动截取网页快照,并将生成的图片存储到云端,需要的可以参考下
    2024-12-12
  • Python pip 常用命令汇总

    Python pip 常用命令汇总

    这篇文章主要介绍了Python pip 常用命令汇总,帮助大家更好的理解和使用pip命令,感兴趣的朋友可以了解下
    2020-10-10
  • pyqt5教程QGraphicsScene及QGraphicsView使用基础

    pyqt5教程QGraphicsScene及QGraphicsView使用基础

    这篇文章主要为大家介绍了pyqt5教程中QGraphicsScene及QGraphicsView使用基础,有序要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • Python实现PS滤镜的旋转模糊功能示例

    Python实现PS滤镜的旋转模糊功能示例

    这篇文章主要介绍了Python实现PS滤镜的旋转模糊功能,涉及Python基于skimage库针对图片进行旋转与模糊化处理的相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • python数据处理 根据颜色对图片进行分类的方法

    python数据处理 根据颜色对图片进行分类的方法

    今天小编就为大家分享一篇python数据处理 根据颜色对图片进行分类的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • 浅谈FastAPI到底用不用async问题

    浅谈FastAPI到底用不用async问题

    这篇文章主要介绍了FastAPI到底用不用async问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Python给对象数组排序的方法实现

    Python给对象数组排序的方法实现

    本文主要介绍了Python给对象数组排序的方法实现,可以使用sorted()函数或list.sort()方法来对对象数组按照第二个值进行排序,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • python selenium爬取斗鱼所有直播房间信息过程详解

    python selenium爬取斗鱼所有直播房间信息过程详解

    这篇文章主要介绍了python selenium爬取斗鱼所有直播房间信息过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08

最新评论