Python處理列表套字典結(jié)構(gòu)JSON數(shù)據(jù)的三種方式對比
前言
對于 “列表套字典”(JSON 數(shù)組包含對象)類型的 JSON 文件,查找并修改特定鍵值的思路是:先遍歷列表中的每個字典,找到符合條件的目標(biāo)字典,再修改該字典中指定鍵的值,最后寫回文件。
示例場景
假設(shè) users.json 文件內(nèi)容如下(列表套字典結(jié)構(gòu)):
[
{"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 文件(列表套字典結(jié)構(gòu),解析后是 Python 列表)
with open("users.json", "r", encoding="utf-8") as f:
data_list = json.load(f) # data_list 是一個包含字典的列表
# 2. 遍歷列表,查找目標(biāo)字典并修改值
for item in data_list:
# 假設(shè)通過 "id" 定位目標(biāo)字典(可根據(jù)實際條件調(diào)整)
if item.get("id") == 2: # 找到 id=2 的字典
item["age"] = 31 # 修改 age 的值
item["active"] = True # 修改 active 的值
break # 找到后退出循環(huán),提高效率
# 3. 將修改后的列表寫回 JSON 文件
with open("users.json", "w", encoding="utf-8") as f:
json.dump(data_list, f, indent=2, ensure_ascii=False)潛在問題及優(yōu)化方案
在處理 “列表套字典” 結(jié)構(gòu)的 JSON 數(shù)據(jù)時,遍歷列表是最直接的方式,但對于數(shù)據(jù)量極大的場景(如幾萬 / 幾十萬條數(shù)據(jù)),遍歷的效率確實可能偏低。此時可以通過優(yōu)化查找邏輯或借助第三方庫提升效率,具體方法如下:
方法 1:用 “字典映射” 預(yù)處理,將列表轉(zhuǎn)為索引字典(推薦)
如果列表中的字典有唯一標(biāo)識鍵(如id),可以先將列表轉(zhuǎn)換為以該標(biāo)識為鍵的字典(相當(dāng)于建立 “索引”),后續(xù)查找時直接通過鍵獲取目標(biāo)字典,時間復(fù)雜度從遍歷的O(n)降至O(1)。
示例(基于之前的users.json):
import json
# 1. 讀取數(shù)據(jù)并構(gòu)建索引字典(以id為鍵)
with open("users.json", "r", encoding="utf-8") as f:
data_list = json.load(f)
# 構(gòu)建映射:{id: 對應(yīng)的字典}
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)優(yōu)勢:
- 預(yù)處理一次后,后續(xù)多次查找 / 修改均為
O(1),適合頻繁操作的場景。 - 不改變原列表結(jié)構(gòu),寫回文件時直接用原列表即可(因為字典是引用類型,修改映射中的字典會同步影響原列表)。
方法 2:用列表推導(dǎo)式 / 生成器表達(dá)式簡化查找(適合單次查找)
如果只需單次查找,可通過列表推導(dǎo)式或生成器表達(dá)式快速定位目標(biāo),代碼更簡潔(本質(zhì)仍是遍歷,但寫法更高效)。
示例:
import json
with open("users.json", "r", encoding="utf-8") as f:
data_list = json.load(f)
# 用生成器表達(dá)式查找第一個符合條件的字典(找到即停止)
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)優(yōu)勢:
- 借助
next()和生成器表達(dá)式,找到目標(biāo)后會立即停止遍歷(類似帶break的循環(huán)),避免多余操作。 - 代碼更簡潔,適合一次性查詢修改。
方法 3:借助第三方庫(如pandas)處理結(jié)構(gòu)化數(shù)據(jù)
如果 JSON 數(shù)據(jù)是結(jié)構(gòu)化的(如每個字典的鍵相同,類似表格),可以用pandas將其轉(zhuǎn)為 DataFrame,通過類似 SQL 的查詢語法快速定位和修改,適合大數(shù)據(jù)量場景。
示例:
import json
import pandas as pd
# 1. 讀取JSON并轉(zhuǎn)為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. 轉(zhuǎn)回列表并寫回文件
updated_list = df.to_dict("records") # 轉(zhuǎn)為列表套字典
with open("users.json", "w", encoding="utf-8") as f:
json.dump(updated_list, f, indent=2, ensure_ascii=False)優(yōu)勢:
pandas底層用 C 實現(xiàn),處理大數(shù)據(jù)量(如 10 萬 + 條)時效率遠(yuǎn)高于純 Python 遍歷。- 支持復(fù)雜條件查詢(如多鍵組合篩選),語法更直觀。
注意:需要安裝pandas(pip install pandas),適合數(shù)據(jù)結(jié)構(gòu)化程度高的場景。
總結(jié):如何選擇
- 小數(shù)據(jù)量(幾百條以內(nèi)):直接遍歷或生成器表達(dá)式即可,代碼簡單,效率差異可忽略。
- 大數(shù)據(jù)量 + 有唯一標(biāo)識:優(yōu)先用 “字典映射” 預(yù)處理,單次預(yù)處理
O(n),后續(xù)操作O(1),性價比最高。 - 大數(shù)據(jù)量 + 結(jié)構(gòu)化數(shù)據(jù):用
pandas,適合需要頻繁進(jìn)行復(fù)雜查詢和修改的場景。
本質(zhì)上,除了建立索引(方法 1)和借助底層優(yōu)化的庫(方法 3),其他方式仍依賴遍歷,但通過 “提前終止”(如break、next())可減少無效操作,效率差異主要體現(xiàn)在數(shù)據(jù)量極大的場景中。
到此這篇關(guān)于Python處理列表套字典結(jié)構(gòu)JSON數(shù)據(jù)的三種方式對比的文章就介紹到這了,更多相關(guān)Python處理JSON數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django中傳遞參數(shù)到URLconf的視圖函數(shù)中的方法
這篇文章主要介紹了Django中傳遞參數(shù)到URLconf的視圖函數(shù)中的方法,Django是最具人氣的Python開發(fā)框架,需要的朋友可以參考下2015-07-07
python?opencv背景減去法摳圖實現(xiàn)示例
這篇文章主要為大家介紹了python?opencv背景減去法摳圖實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
python3.7中安裝paddleocr及paddlepaddle包的多種方法
這篇文章主要介紹了python3.7中安裝paddleocr及paddlepaddle包,本文通過多種方法給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
python常用模塊(math itertools functools sys
這篇文章主要介紹了python常用模塊之math itertools functools sys shutil的使用示例講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
Python numpy有哪些常用數(shù)據(jù)類型
Numpy提供了兩種基本的對象:ndarray(N-dimensional Array Object)和 ufunc(Universal Function Object)。ndarray是存儲單一數(shù)據(jù)類型的多維數(shù)組,而ufunc則是能夠?qū)?shù)組進(jìn)行處理的函數(shù)2023-02-02

