在撰寫 Python 程式時,我們經常會遇到一種情況:
「我們想把資料放進字典(Dictionary)裡,
但我們不確定這個 Key 到底存不存在。
如果不存在,我們需要先給它一個初始值。」
最常見的應用場景就是「分類資料」。
讓我們用一個非常簡單的教學例子來看看!
📝 情境:學生社團分類
假設我們有一份學生的報名資料,我們想把它整理成一個字典,
讓「社團名稱」變成 Key,而「參加的學生名單 (List)」變成 Value。
# 報名資料
records = [
("Alice", "吉他社"),
("Bob", "熱舞社"),
("Charlie", "吉他社"),
("David", "魔術社"),
("Eve", "熱舞社")
]❌ 寫法一:常見的新手寫法 (加上 if 判斷)
如果不用任何特殊語法,我們通常會這樣寫:
club_members = {}
for name, club in records:
# 1. 先檢查社團 (Key) 是否已經在字典裡
if club not in club_members:
# 2. 如果不在,就先建立一個空的列表
club_members[club] = []
# 3. 把學生名字加進列表裡
club_members[club].append(name)
print(club_members)
# 輸出: {'吉他社': ['Alice', 'Charlie'], '熱舞社': ['Bob', 'Eve'], '魔術社': ['David']}這段程式碼完全正確,
但為了「如果 Key 不存在就建立空列表」這件事,
我們多寫了兩行 if 判斷,稍微有點囉嗦。
✨ 寫法二:老練的寫法 (使用 setdefault)
這時候就是 setdefault 登場的最佳時機了!
同樣的邏輯,我們可以縮減成一行:
club_members = {}
for name, club in records:
# 核心魔法就在這一行:
club_members.setdefault(club, []).append(name)
print(club_members)
# 輸出一樣是: {'吉他社': ['Alice', 'Charlie'], '熱舞社': ['Bob', 'Eve'], '魔術社': ['David']}
🔍 拆解 setdefault 的運作原理
dictionary.setdefault(key, default_value) 這個函式在執行時,
其實偷偷幫你做了以下三件事:
尋找:檢查字典裡有沒有 club 這個 Key。
沒有的話就賦值:如果沒有這個 Key,
它會自動幫你在字典裡新增 club: [] (這裡的 [] 就是我們傳进去的預設值)。
回傳結果給我們操作:不管是原本就存在的 List,還是剛剛才建立的空 List,
它都會把這個 List 拋出來給我們。
因此,我們可以直接在後面接上 .append(name),把資料塞進去。
推薦hahow線上學習python: https://igrape.net/30afN

![Python: 如何用 pandas.DataFrame.apply 讓DataFrame增加新的一欄 ; df[“mean”] = df.apply( np.mean, axis=1) ; DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwargs) Python: 如何用 pandas.DataFrame.apply 讓DataFrame增加新的一欄 ; df[“mean”] = df.apply( np.mean, axis=1) ; DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwargs)](https://i0.wp.com/savingking.com.tw/wp-content/uploads/2023/05/20230519084320_22.png?quality=90&zoom=2&ssl=1&resize=350%2C233)




![Python 進階技巧:海象運算子 (Walrus Operator) 實戰教學 [w_clean for w in words if (w_clean:=w.lower().strip()) and w_clean not in STOPWORDS] Python 進階技巧:海象運算子 (Walrus Operator) 實戰教學 [w_clean for w in words if (w_clean:=w.lower().strip()) and w_clean not in STOPWORDS]](https://i0.wp.com/savingking.com.tw/wp-content/uploads/2026/02/20260210083748_0_a7d9bf.png?quality=90&zoom=2&ssl=1&resize=350%2C233)



近期留言