嗨囉!時間真的過的很快~一下就已經來到Day17了!
昨天我們認識了 Tuple(元組),知道了「固定不動、不可修改」的資料容器,
也有做一些List和Tuple的比較,相信讀者們已經掌握住重點了~
今天,我們要介紹集合型態的另一位成員:Set(集合),
它和 List / Tuple 又有不同特色!ㄧ起來看看吧!
範例:
my_set = {1, 2, 3, 3, 2}
print(my_set) # {1, 2, 3}
print(type(my_set)) # <class 'set'>
輸出:
{1, 2, 3}
<class 'set'>
小提醒:
[0]
取值特性 | List | Tuple | Set |
---|---|---|---|
是否可修改 | 可 | 不可 | 可新增/刪除元素 |
是否有順序 | 有 | 有 | 無 |
是否允許重複 | 可 | 可 | 不允許 |
語法 | [] |
() |
{} |
常見用途 | 動態清單、任務清單 | 固定資料、設定值、字典 key | 去重、快速查詢、集合運算 |
遍歷方式 | for |
for |
for (無順序) |
add()
s = {1, 2, 3}
s.add(4)
print(s)
輸出:
{1,2,3,4}
remove()
/ discard()
s = {1, 2, 3}
s.remove(2) # 2 不存在會報錯
s.discard(5) # 5 不存在也沒事
print(s) # {1,3}
輸出:
{1,3}
如果寫成 (5)
→ Python 會當作數字,不是 tuple!
3.清空集合:clear()
s.clear()
print(s) # set()
輸出:
set()
4.長度與成員檢查
s = {1, 2, 3}
print(len(s)) # 3
print(2 in s) # True
print(5 in s) # False
輸出:
3
True
False
上面的基本操作範例是不是有點陽春呢?(無趣)
接下來我會用比較日常的例子去解釋上面提到的操作!一起來看看吧~
1️⃣ 建立集合
fruits = {"蘋果", "香蕉", "橘子"}
print(fruits)
輸出:
有發現嗎?輸出沒有特別「按照」順序喔!
這也是Set的特點之一。
{}
建立集合,元素會自動去重(不會有重複水果)。2️⃣ 新增元素 add()
# Alice 想增加喜歡的水果
fruits.add("西瓜")
print(fruits)
輸出:
3️⃣ 移除元素 remove()
/ discard()
# Alice 不喜歡香蕉了
fruits.remove("香蕉")
print(fruits)
# discard 不會報錯
fruits.discard("芒果") # 集合中沒有芒果也不會出錯
輸出:
這邊整理一下集合的運算符號!可以對照白話文的解說對著看會比較容易一些~
|
→ 「把兩個集合的元素都列出」&
→ 「找出兩個集合都有的元素」-
→ 「找出第一個集合有但第二個沒有的元素」^
→ 「找出兩個集合中不重複的元素」1.集合運算
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print("聯集 a|b:", a | b)
print("交集 a&b:", a & b)
print("差集 a-b:", a - b)
print("對稱差 a^b:", a ^ b)
輸出:
這邊看一下比較生活化的範例:
Saturday_activities = {"跑步", "游泳", "看書"}
Sunday_activities = {"游泳", "看電影", "看書"}
# 聯集 → 週末活動總集
print("週末總活動:", Saturday_activities | Sunday_activities)
# 交集 → 兩天都想做的活動
print("週末兩天都想做的活動:", Saturday_activities & Sunday_activities
# 差集 → 只想在星期六做的活動
print("星期六專屬活動:", Saturday_activities - Sunday_activities)
輸出:
2.延續上面提到的水果例子,我們也用集合運算去玩玩看~
(1)聯集 | / union()
# Alice 和 Bob 喜歡的水果
alice = {"蘋果", "香蕉", "橘子"}
bob = {"香蕉", "西瓜", "芒果"}
# 聯集:兩人喜歡的所有水果
all_fruits = alice | bob
print(all_fruits)
輸出:(列出兩個人的水果清單,所有不重複的水果都列出來)
(2) 交集 & / intersection()
# 交集:兩人都喜歡的水果
common_fruits = alice & bob
print(common_fruits)
輸出:(找出兩人都喜歡的水果,就是「共同喜好」)
(3)差集 - / difference()
# Alice 喜歡但 Bob 不喜歡的水果
unique_alice = alice - bob
print(unique_alice)
輸出:(Alice 喜歡但 Bob 不喜歡的水果)
(4)對稱差集 ^ / symmetric_difference()
# 兩人喜歡但不重複的水果
diff_fruits = alice ^ bob
print(diff_fruits)
輸出:
(5)查詢元素是否存在(輸出會是布林值)
# Alice 是否喜歡蘋果?
print("蘋果" in alice)
print("西瓜" in alice) # False
輸出:
情境:學生選課,每個學生最多 3 門,不能選重複課程。
這邊先看一下完整的程式碼:
students = ["Alice", "Bob", "Charlie"]
courses = ["Python", "C", "Java", "HTML", "CSS"]
registrations = {}
for student in students:
selected = set()
print(f"\n{student} 選課開始!")
while len(selected) < 3:
print("可選課程:", courses)
choice = input("輸入課程名稱 (輸入 '結束' 完成):")
if choice == "結束":
if len(selected) >= 1:
break
else:
print("⚠️ 至少要選一門課")
continue
if choice not in courses:
print("⚠️ 無效課程")
continue
if choice in selected:
print("⚠️ 已選過此課程")
continue
selected.add(choice)
print(f"✅ 選擇 {choice}")
registrations[student] = selected
print("\n📋 選課結果:")
for student, selected in registrations.items():
print(f"{student}: {selected}")
完整輸出:
學習重點:
while
條件控制 + continue
錯誤處理。union
) → 適合統計所有學生的熱門課程有哪些。intersection
) → 適合找出大家都選的必修課或共通課程。difference
) → 可以找出每個學生的個人化課程或漏選課程。symmetric_difference
) → 找出兩人選課完全不重疊的部分。# 所有學生選課的總集合(聯集)
all_courses = set()
for selected in registrations.values():
all_courses |= selected # 等同 all_courses = all_courses.union(selected)
print("所有學生選過的課程(聯集):", all_courses)
# 找出所有學生都選的課程(交集)
common_courses = set(courses) # 初始設為全部課程
for selected in registrations.values():
common_courses &= selected # 交集
print(" 所有學生都選的課程(交集):", common_courses)
# 找出 Alice 選但 Bob 沒選的課程(差集)
alice_courses = registrations["Alice"]
bob_courses = registrations["Bob"]
alice_not_bob = alice_courses - bob_courses
print(" Alice 選但 Bob 沒選的課程(差集):", alice_not_bob)
# 找出 Bob 選但 Alice 沒選的課程
bob_not_alice = bob_courses - alice_courses
print(" Bob 選但 Alice 沒選的課程(差集):", bob_not_alice)
# 兩人選課的交集(共同課程)
alice_bob_common = alice_courses & bob_courses
print(" Alice 與 Bob 的共同課程:", alice_bob_common)
輸出:
今天我們認識了 集合型態家族的新成員:Set(集合),
它跟 List、Tuple 都有點像,但又很不一樣:
我們也比對了目前教過的三種集合型態!
特性 | List | Tuple | Set |
---|---|---|---|
可否修改 | 可以 | 不行 | 可以(新增/刪除) |
元素可否重複 | 可以 | 可以 | 不行 |
是否有順序 | 有 | 有 | 沒有 |
適合用途 | 任務清單、動態資料 | 固定資料、設定值、字典 key | 去重、比對、集合運算 |
今天我們也做了有關於set的實戰練習:
有感覺嗎?
Set 就像是一個「隨手去重的小幫手」,
適合用在比對、統計或過濾資料時,比 List 或 Tuple 更省事。
如果對於今天的內容有疑惑,歡迎在底下留言呦!
那麼,今天也辛苦啦!!我們明天見喔~