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])匯總記錄
你的練習清單
- 說清外層集合和內部欄位分別是什麼。
- 每一層使用一對方括號。
- 走訪記錄,而不是硬編碼索引。
- 鍵可能缺失時,使用 get 或成員判斷。
常見問題
怎樣存取字典列表裡的值?
先選中列表元素,再選中字典鍵:orders[0]["price"]。也可以走訪列表,從每條記錄讀取鍵。
鍵不存在怎麼辦?
直接存取會拋出 KeyError。需要預設值時用 order.get("discount", 0),或者先判斷鍵是否存在。
巢狀資料應該拍平嗎?
只有拍平後下一步操作明顯更簡單時才這樣做。保留記錄結構通常更容易理解。
練習巢狀資料
12 道題,覆蓋字典列表、巢狀鍵、更新和求和。
繼續閱讀: