專項練習 · 8 分鐘閱讀

Python 巢狀資料練習:字典列表

巢狀資料看起來複雜,直到你給每一層命名。字典列表不過是一組記錄,每個字典就是一條帶欄位的記錄。

從一條記錄開始

一個字典適合儲存一條記錄:每個鍵是欄位名,每個值儲存資料。先把單條記錄列印出來,看清結構,再添加更多記錄。

order = {"drink": "latte", "price": 4.5}
print(order["drink"])
print(order["price"])

一個字典,兩個欄位

一次讀取一層

值還是字典時,再加一對方括號。data["shop"] 回傳內層字典,再用 ["name"] 讀取其中的欄位。不要把整條路徑硬塞進一次存取。

data = {"shop": {"name": "Corner", "open": True}}
print(data["shop"]["name"])

兩層鍵

走訪記錄

記錄很多時,把字典放進列表。走訪列表,從每條記錄裡讀取同一個鍵。只需要每條的某個欄位時,列表推導式很方便。

orders = [{"drink": "latte"}, {"drink": "tea"}]
for order in orders:
    print(order["drink"])

記錄集合

更新巢狀值

賦值可以沿著完整路徑進行:選中記錄,再選中鍵,然後賦新值。把更新寫在能解釋原因的位置附近。

orders = [{"price": 3.0}, {"price": 4.5}]
orders[0]["price"] = 3.5
print(orders[0]["price"])

更新一個欄位

求和與篩選

生成器表達式從每條記錄讀取一個欄位,sum 再把結果相加。只統計部分記錄時,加上 if 子句。總和不對時,先列印中間列表。

orders = [{"price": 3.0}, {"price": 4.5}, {"price": 2.0}]
print(sum(order["price"] for order in orders))
print([order["price"] for order in orders if order["price"] > 3])

匯總記錄

你的練習清單

常見問題

怎樣存取字典列表裡的值?

先選中列表元素,再選中字典鍵:orders[0]["price"]。也可以走訪列表,從每條記錄讀取鍵。

鍵不存在怎麼辦?

直接存取會拋出 KeyError。需要預設值時用 order.get("discount", 0),或者先判斷鍵是否存在。

巢狀資料應該拍平嗎?

只有拍平後下一步操作明顯更簡單時才這樣做。保留記錄結構通常更容易理解。

練習巢狀資料

12 道題,覆蓋字典列表、巢狀鍵、更新和求和。

打開練習

繼續閱讀: