第 5 章
集合與字典:快速分組與查找
當你想知道某個值有沒有出現過,或想用一個鍵快速找到對應資料時,集合與字典就很實用。它們看似平凡,卻幾乎每天都在幫我們省時間。
Set & Dictionary
預計閱讀時間:約 5 分鐘
本章開場
你正在整理聯絡人名單,突然發現同一個人被輸入了三次。另一邊,主管又要你立刻查出員工編號 A173 對應的是誰。這兩件事看起來不同,但背後都指向同一個需求:要嘛快速判斷某筆資料是否存在(這是集合的工作),要嘛快速用一個代號找到對應內容(這是字典的工作)。
本章要解決的問題
當資料量一大,光靠一列一列翻找會很慢。如果你真正關心的是「有沒有重複」或「這個鍵對應到什麼」,就需要比逐筆掃描更直接的整理方式。
核心概念
集合可以理解成一個只在乎「有沒有出現過」的容器。它不強調順序,也不在意同樣的值放幾次,因為重點是唯一性。只要某個值已經存在,再放進去一次也不會多出第二份。
字典則更像一本對照表。你給它一個鍵,它會回你對應的值。像是姓名對電話、員編對部門、商品代號對價格,都是典型的字典思維。這種結構的價值,在於把查找從「一個個找」變成「直接對照」。
集合回答的是「這個東西有沒有」,字典回答的是「這個鍵對應什麼」。
兩者都強調查找效率,但前提是鍵與分類方式要設計得清楚。若鍵不一致、命名混亂或規則不穩定,再好的結構也會被搞亂。
這在生活中像什麼
你整理購物清單時,若只想避免重複買同樣商品,這很像集合。你不一定在意順序,但很在意「牛奶是不是已經寫過了」。同樣地,朋友聚餐統計名單時,也常需要先去重,免得重複計算人數。
字典的生活感更強。手機通訊錄裡,名字對應電話;捷運站名對應路線;收納箱編號對應箱內物品。當你拿一個鍵去換資訊時,你就在使用字典式的思考。
具體例子
- 聚餐名單去重(集合):多人在群組裡陸續報名,有人重複按了兩次。用集合概念整理,每人只保留一筆,最後統計人數不會算多。
- 超市商品條碼(字典):掃描條碼,系統立刻對應出商品名稱與價格,收銀員不必一個一個查商品目錄,結帳快速又準確。
- 宿舍房號對應住宿者(字典):管理員輸入房號 306,立刻查到是哪位同學,寄包裹通知或維修登記都能精準對上。
- 語言學習字彙卡(字典):每張卡片正面是外文單字,背面是中文解釋。鍵是單字,值是意思,抽一張就能直接對照,不必翻整本字典。
- 快遞寄件白名單(集合):公司設有可接受寄件的客戶清單,每次有新寄件申請,只需確認「名單裡有沒有這家公司」,在集合裡的就放行,不在就暫停,不需要逐一比對整份合約資料庫。
這在工作上有什麼用
行政工作常遇到代碼表,例如狀態碼對應說明、假別代號對應假種。教學工作可能會有學號對應學生姓名、課程代碼對應授課資訊。業務或客服系統則常有客戶編號對應基本資料、訂單編號對應處理狀態。
如果沒有字典式結構,系統和人都容易回到逐筆搜尋的模式,查一次還能忍,查一百次就會浪費大量時間。集合則在名單比對、權限清單、標籤管理、去除重複資料時特別有用。
為什麼重要
- 它能把大量重複查找的成本降下來。
- 它適合處理唯一性、標籤、代碼對照等常見需求。
- 它讓資料不只是被存起來,而是可以被快速叫出來使用。
限制也很清楚。若鍵定義不一致,例如同一位客戶有兩種編碼,或姓名格式不統一,就會讓字典失效。集合也不適合拿來保留複雜順序資訊,因為它的強項從來不是排序,而是存在性與去重。
一句話總結
集合幫你判斷有沒有重複,字典幫你用一個鍵快速找到答案。
💭 捲輊三問
- 你現在的工作有沒有「快速確認某個人或事項是否存在」的需求?它用哪種方式在做?
- 字典的「鍵值(key-value)」概念對你來說,最像生活中的哪個場景?
- 如果要設計一個「快速查詢客戶資料」的系統,你會選擇什麼結構來存它?