第 12 課 · 入門 · 18 分鐘

Python 元組與集合

固定記錄用元組,唯一值集合用 set,讓資料結構的意圖更清楚。

元組解包集合去重成員判斷

套餐永遠是飲料加杯型——正好兩個值,不會是三個。配料卻是一堆沒有順序、也不能重複的加料。哪種容器能用形狀把這兩件事說清楚?

列表不是 Python 裡唯一的集合型別。元組把固定數量的值組合起來,建立後不能修改;集合儲存唯一值,成員判斷很快。知道該選哪一種,程式碼的意圖會更清楚。 你還會回傳固定形狀的記錄、用集合判斷成員關係,並比較權限集合。

元組是固定記錄

元組用圓括號表示,保留值的順序。你可以按索引讀取,也可以一次解包到多個變數。元組建立後不能修改,因此適合坐標、鍵值對,或本來就應該保持不變的記錄。

point = (3, 5)
x, y = point
print(x + y)

解包元組

集合儲存唯一值

set 會去掉重複項,但不保證顯示順序。當「是否唯一」或「是否存在」比位置更重要時,就用集合。把列錶轉成集合,是統計不同值的快捷方式。

orders = ["latte", "tea", "latte"]
unique = set(orders)
print(len(unique))
print("tea" in unique)

去重與成員判斷

集合運算

& 取兩個集合的交集,| 取併集。需要穩定輸出順序時,先對結果排序。不要依賴集合本身的顯示順序。

a = {1, 2, 3}
b = {3, 4}
print(sorted(a & b))
print(sorted(a | b))

交集與併集

元組是固定形狀,不是短列表

欄位數量本身就是含義時,用元組。divmod() 回傳商和餘數,解包可以一次給兩個名字。帶星號的目標會收集剩下的值,適合「表頭加可變尾部」的記錄。

quotient, remainder = divmod(17, 5)
print(quotient, remainder)
record = ("2026-10-28", "latte", 4.5, "paid")
date, drink, *rest = record
print(date, drink)
print(rest)

形狀固定時,按位置解包

集合回答的是成員問題

集合去重,並能快速回答 in。它不保證插入順序,所以顯示前先排序。需要歷史順序或保留重複項時,仍然用列表;只有「唯一」是目標時才轉成集合。

visits = ["home", "menu", "home", "checkout"]
unique_pages = set(visits)
print(len(unique_pages))
print(sorted(unique_pages))
print("menu" in unique_pages)
print("help" in unique_pages)

唯一值,不是時間線

用子集和差集比較權限

集合運算可以表達權限規則。required <= granted 問的是「必需權限是否齊全」;granted - required 列出多餘項,required - granted 列出缺口。交集非空,比子集判斷弱得多。

required = {"read", "write"}
granted = {"read", "write", "admin"}
print(required <= granted)
print(sorted(granted - required))
print(sorted(required - granted))
print(sorted(required ^ granted))

子集判斷權限是否完整

本課要點

  • 元組保留順序,不能原地修改。
  • 元組解包會把每個值賦給一個變數。
  • 集合去重,並支援快速的成員判斷。
  • 需要順序時,列印集合前先排序。
  • 固定記錄用元組,唯一性和成員判斷用集合。

常見錯誤

  • 試圖對元組呼叫 append,而不是建立新元組。
  • 以為集合會保留原列表順序。
  • 只關心值是否存在時,仍然使用列表。
  • 只檢查交集是否非空,卻忘了每個必需權限都要存在。
輪到你

建立一個包含名稱和價格的元組,解包後列印格式化句子。

動手試試

改改變數、先預測輸出,再執行程式碼。第一次點擊「執行程式碼」時會下載 Python 執行時,可能需要幾秒鐘。

瀏覽器內 Python本機執行 · 無需帳號
首次執行會從 CDN 下載 Pyodide。修改後點擊「執行程式碼」。

練習本課

12 道題,作答後立即看到解釋。

查看 12 道題答案開始練習
← while 迴圈推導式 →