本文 AI 產出,尚未審核

Python 資料結構 – 字典(dict)

建立、取值、刪除


簡介

在 Python 中,字典(dict) 是最常用的可變容器之一。它以「鍵‑值」的形式儲存資料,提供 O(1) 的查詢與更新效能,適合用來做快速的資料對應、設定管理、統計計算等工作。無論是處理 API 回傳的 JSON、建立映射表,或是實作簡易的快取機制,字典都是不可或缺的工具。

本篇文章聚焦於 字典的三大基本操作建立取值刪除。透過淺顯易懂的說明與實用範例,讓剛踏入 Python 的新手能快速上手,同時提供中級開發者在實務專案中提升程式碼品質的技巧。


核心概念

1. 建立字典

字典可以用多種方式產生,最常見的是使用大括號 {}dict() 建構子。

# 方式一:直接使用大括號,鍵值對以冒號分隔,項目之間以逗號分隔
person = {
    "name": "Alice",
    "age": 28,
    "city": "Taipei"
}
print(person)          # {'name': 'Alice', 'age': 28, 'city': 'Taipei'}

# 方式二:使用 dict(),適合鍵是合法的變數名稱時
config = dict(host="localhost", port=3306, debug=True)
print(config)          # {'host': 'localhost', 'port': 3306, 'debug': True}

# 方式三:從可迭代的 (key, value) 兩元組建立
pairs = [("apple", 3), ("banana", 5), ("orange", 2)]
fruit_qty = dict(pairs)
print(fruit_qty)       # {'apple': 3, 'banana': 5, 'orange': 2}

小技巧:若鍵是字串且符合變數命名規則,使用 dict() 可寫得更簡潔;若鍵包含空格或特殊字元,仍需使用大括號。


2. 取值(存取資料)

2.1 直接索引

# 直接使用鍵取得值,若鍵不存在會拋出 KeyError
age = person["age"]
print(age)             # 28

2.2 get() 方法

# 使用 get() 可提供預設值,避免例外
salary = person.get("salary", 0)   # 若不存在回傳 0
print(salary)          # 0

2.3 檢查鍵是否存在

if "city" in person:
    print("城市資訊:", person["city"])
else:
    print("沒有城市資訊")

2.4 取得所有鍵、值或鍵值對

keys = person.keys()          # dict_keys(['name', 'age', 'city'])
values = person.values()      # dict_values(['Alice', 28, 'Taipei'])
items = person.items()        # dict_items([('name', 'Alice'), ('age', 28), ('city', 'Taipei')])

for k, v in items:
    print(f"{k} => {v}")

3. 刪除元素

3.1 del 關鍵字

# 刪除特定鍵值對,若鍵不存在會拋出 KeyError
del person["city"]
print(person)          # {'name': 'Alice', 'age': 28}

3.2 pop() 方法

# pop() 會回傳被刪除的值,且允許設定預設值
removed_age = person.pop("age")
print(removed_age)     # 28
print(person)          # {'name': 'Alice'}

# 若鍵不存在且未提供預設值,仍會拋出 KeyError
# person.pop("gender")   # KeyError

3.3 popitem() 方法

# popitem() 會隨機(Python 3.7+ 為 LIFO)移除最後加入的鍵值對
fruit_qty["grape"] = 7
last_item = fruit_qty.popitem()
print(last_item)       # ('grape', 7)
print(fruit_qty)       # {'apple': 3, 'banana': 5, 'orange': 2}

3.4 清空整個字典

person.clear()
print(person)          # {}

常見陷阱與最佳實踐

陷阱 說明 建議的寫法
KeyError 直接使用 dict[key] 時,如果鍵不存在會拋出例外。 使用 dict.get(key, default) 或先檢查 if key in dict
可變物件作為鍵 只能使用 不可變(hashable)物件作為鍵,如字串、數字、tuple。 切勿把 list、dict 本身作為鍵;若需要複雜鍵,可使用 frozenset 或自訂的 __hash__
共享同一個預設字典 使用 dict.setdefault() 時,若預設值是可變物件,所有鍵會共享同一個實例。 使用 defaultdictcollections 模組)或在 setdefault 中傳入 copy.deepcopy
迭代時同時修改字典 在遍歷 dict 時直接刪除或新增鍵會拋出 RuntimeError 先把鍵列成清單 for k in list(d): 再操作,或使用 dict comprehension
字典順序的誤解 Python 3.6 之後字典保持插入順序,但仍不保證排序。 若需要排序結果,使用 sorted(d.items())collections.OrderedDict

最佳實踐

  1. 使用 dict.get() 取代直接索引,提升容錯性。
  2. Prefer defaultdict 當需要自動建立預設容器(list、set 等)。
  3. 避免在迭代時改變字典,改用 list(d)dict.copy()
  4. 保持鍵的不可變性,確保字典的雜湊穩定。
  5. 寫測試:對於關鍵的查詢或刪除邏輯,加入單元測試以防止 KeyError 或資料遺失。

實際應用場景

  1. API 回傳資料的解析

    import json, requests
    
    resp = requests.get("https://api.example.com/user/123")
    data = resp.json()               # data 為 dict
    username = data.get("username") # 安全取得
    
  2. 設定檔管理

    # config.yaml 轉成 dict
    import yaml
    with open("config.yaml") as f:
        cfg = yaml.safe_load(f)
    
    # 取得設定,若未設定使用預設值
    log_level = cfg.get("log_level", "INFO")
    
  3. 統計字詞出現次數

    from collections import defaultdict
    
    text = "Python 是一門易學且功能強大的程式語言".split()
    counter = defaultdict(int)
    for word in text:
        counter[word] += 1
    
    print(counter)   # defaultdict(<class 'int'>, {'Python': 1, '是': 1, ...})
    
  4. 快取(Cache)實作

    cache = {}
    
    def get_user(id):
        if id in cache:
            return cache[id]          # 直接回傳快取
        # 否則從資料庫取得
        user = query_db(id)
        cache[id] = user
        return user
    
  5. 資料關聯映射

    # 商品編號 ↔ 商品資訊
    products = {
        101: {"name": "筆記型電腦", "price": 35000},
        102: {"name": "手機", "price": 12000},
    }
    
    pid = 101
    print(f"商品名稱: {products[pid]['name']}, 價格: {products[pid]['price']}")
    

總結

字典是 Python 中最核心、最彈性的資料結構之一。透過 建立取值刪除 這三個基本操作,我們可以快速完成資料的映射、設定管理與即時查詢。掌握了 dict 的正確使用方式,並留意常見的陷阱與最佳實踐,能讓程式碼更安全、效能更佳,也為日後處理更複雜的資料結構奠定堅實基礎。

實務建議:在新專案中,先規劃好字典的鍵與值的類型,盡量使用不可變鍵,並透過 get()defaultdictsetdefault 來避免不必要的 KeyError。在需要保持順序或排序的情況下,考慮使用 OrderedDict 或在取值後自行排序。

祝你在 Python 的世界裡玩得開心,將字典運用得爐火純青! 🚀