何謂集合
集合(set)儲存的是無序列的元素,而且儲存時會自動移除重複的元素,所以在集合中是不存在重複的元素。
# 方法1
集合型別 = {元素1,元素2,…}
# 方法2
集合型別 = set((元素1,元素2,…))-
使用
- 方法1 建立集合時,其中的元素可以使用的型別為數值、字串和元組。
- 方法2 則還可以使用串列,字典。例如:
# 資料型態:tuple(元組),允許重複元素,且會保持輸入順序 => (1, 2, 3, 1, 2) s1 = set((1, 2, 3, 1, 2)) # 集合元素為 1、2、3,重複者會被刪除 # 資料型態:tuple(元組),元組裡面可以包含不同資料型態,甚至是巢狀元組(把 (2, 3) 當成其中一個元素)。 => ('A', (2, 3), 4) s2 = set(('A', (2,3), 4)) # 集合元素為 'A'、(2,3)、4 # 資料型態:set(集合), s3 = set(range(1, 11)) # 集合元素為 1 ~ 10,range(1, 11) 會產生從 1 到 10 的數字序列(不包含 11,set() 將此序列轉為集合 => {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} # 資料型態:set(集合),{1:'A', 2:'B', 3:'C'} 是一個 dict(字典),將字典傳入 set() 時,預設只會抓取字典的鍵(Keys),忽略值(Values) s4 = set({1:'A', 2:'B', 3:'C'}) # 集合元素 為1、2、3 -
要建立空集合時,一定要使用 方法2 寫法如下:
s = set() # 空集合。
集合的基本操作
集合內的元素可以新增刪減,其基本操作語法如下:
| 功能 | 語法說明 |
|---|---|
| 新增 | 語法:集合.add(元素) |
| 刪除 | 語法:集合.remove(元素) |
| 新增 | 語法:集合.update(參數)說明:參數可以是元素或是串列、元組或字典。 |
| 刪除 | 語法:集合.discard(元素)說明:同 remove,其差異是 remove 會產生錯誤訊息,discard 則不會。 |
| 刪除 | 語法:集合.pop()說明:隨機刪除集合中的一個元素。 |
[例]集合基本操作。 (set_1.py)
程式碼: set_1.py
# 直接用大括號建立包含單一字串元素的集合 set1 = {'Anastasia'} print(set1) # 輸出: {'Anastasia'} (集合內只有 1 個長字串元素) # 將字串傳入 set() 函式,字串會被拆解成單一字元,並自動剔除重複字元(如小寫 'a') set1 = set('Anastasia') # 輸出: {'n', 't', 'i', 'a', 'A', 's'} (順序可能隨機,重複的 'a' 被去除了) print(set1) #{'n', 't', 'i', 'a', 'A', 's'} # 將字典傳入 set() 函式,預設只會擷取字典的「鍵 (Key)」 set1 = set({'貓':'cat','狗':'dog'}) print(set1) # 輸出: {'貓', '狗'} # 將字串 '嘻嘻哈哈' 轉為集合,字串被拆成單字元並剔除重複字('嘻' 與 '哈' 各留一個) set1 = set('嘻嘻哈哈') # 輸出: {'嘻', '哈'} (或 {'哈', '嘻'}) print(set1) # 使用 .add() 將「笑嘻嘻」作為「一個完整的元素」加入集合 set1.add('笑嘻嘻') # 輸出: {'嘻', '哈', '笑嘻嘻'} print(set1) # 使用 .remove() 移除指定的元素 '笑嘻嘻' set1.remove('笑嘻嘻') # 輸出: {'嘻', '哈'} print(set1) # 使用 .discard() 嘗試移除 '笑嘻嘻' # 因為在上一步已經移除掉了,但 .discard() 找不到元素時「不會報錯」,會安全地忽略 set1.discard('笑嘻嘻') # 使用 .update() 傳入字串 '笑嘻嘻' # .update() 會把傳入的字串拆解成字元 ('笑', '嘻') 再分別加入,並剔除重複的 '嘻' set1.update('笑嘻嘻') # 輸出: {'嘻', '哈', '笑'} print(set1) # 被註解掉的程式碼:若取消註解,因為目前集合內有 '笑嘻嘻' 拆開後的單字,但沒有完整的 '笑嘻嘻' 字串,執行會報 KeyError 錯誤 #set1.remove('笑嘻嘻') # 使用 .pop() 隨機取出並移除集合中的「任意一個元素」 set1.pop() print(set1)
集合的運算
Python可以對兩個集合進行聯集、交集、差集和互斥等運算,下表為集合運算常用的方法。

| 運算 | 說明與範例 |
|---|---|
| 聯集 | 語法:集合 1 | 集合 2集合 1.union(集合 2)簡例: print(set1 | set2) # {1, 2, 3, 4} 說明:兩個集合中所有的元素。 |
| 交集 | 語法:集合 1 & 集合 2集合 1.intersection(集合 2)簡例: print(set1 & set2) # {3}說明:兩個集合中皆有的元素。 |
| 差集 | 語法:集合 1 - 集合 2集合 1.difference(集合 2)簡例: print(set1 - set2) # {1, 2}說明:屬於集合 1 但不屬於集合 2 的元素組成的集合。 |
| 互斥 | 語法:集合 1 ^ 集合 2集合 1.symmetric_difference(集合 2)簡例: print(set1 ^ set2) # {1, 2, 4}說明:集合 1 和集合 2 的元素組成的集合,但不包含兩集合皆有的元素。 |
| 子集合 | 語法:集合 1 <= 集合 2集合 1.issubset(集合 2)簡例: set1 = {1, 2}set2 = {1, 2, 3}print(set1 <= set2) # True說明:判斷集合 1 是否為集合 2 的子集合。 |
| 超集合 | 語法:集合 1 >= 集合 2集合 1.issuperset(集合 2)簡例: print(set1 >= set2) # False說明:判斷集合 2 的所有元素,是否都包含在集合 1 中。 |
[簡例] 學校有熱門音樂社和流行音樂社兩個社團,社團的參加人員名單,可能有重複登錄,又有同時參加兩個社團的情形。現在兩社團要合併成一個社團,請統計兩社團正確的人數,合併後的人數,以及重複參加的同學名單。(檔名:group.py)
程式碼: group.py
# 這段程式碼主要展示了 **Set(集合)** 去除重複資料,以及進行集合運算(交集與聯集)的實際應用。 # 建立熱門音樂社的原始名單串列 (List),包含重複報名的姓名(例如:'王一'、'張三'出現兩次) g1=['林二','王一','張三','趙六','王一','李四','張三','陳五'] # 建立流行音樂社的原始名單串列 (List),包含重複報名的姓名(例如:'柯七'出現兩次) g2=['鄭十','趙六','劉千','廖八','柯七','張三','王一','呂九','柯七','蔡百'] # 使用 set() 將熱門音樂社名單轉為集合 (Set),自動剔除重複的人名,得到單一不重複的名單 s1 = set(g1) # 印出熱門音樂社的「原始人數 len(g1)」與「去除重複後的正確人數 len(s1)」 print(f'熱門音樂社原來人數:{len(g1)}人 正確人數:{len(s1)}人') # 使用 set() 將流行音樂社名單轉為集合 (Set),自動剔除重複的人名 s2 = set(g2) # 印出流行音樂社的「原始人數 len(g2)」與「去除重複後的正確人數 len(s2)」 print(f'流行音樂社原來人數:{len(g2)}人 正確人數:{len(s2)}人') # 使用 .intersection() 取交集(也可用 s1 & s2),找出同時存在於兩個社團(重複參加)的名單 s3 =s1.intersection(s2) # 印出兩社重複參加的名單(集合形式,例如:{'張三', '王一', '趙六'}) print(f'重複參加社團名單:{s3}') # 使用 .union() 取聯集(也可用 s1 | s2),將兩個社團的名單合併,並自動去除跨社重複的人名 s4 =s1.union(s2) # 印出合併後且不重複的總人數 len(s4) print(f'合併後社團人數:{len(s4)}人')
[結果]
熱門音樂社原來人數:8人 正確人數:6人
流行音樂社原來人數:10人 正確人數:9人
重複參加社團名單:{'張三', '王一', '趙六'}
合併後社團人數:12人[簡例] 請撰寫一程式完成下列項目。
- 可以使用的號碼為
1~7之間的整數。- 電腦以亂數隨機挑選兩個不重複的數字。
- 使用者猜測電腦挑選的號碼,使用者有三次猜測的機會。
程式碼:
guess.py# 設定檔案編碼為 UTF-8,確保中文字串(如 input、print 中的文字)能正常顯示 # -*- coding: utf-8 -*- # 這段程式碼是一個**猜數字(樂透)小遊戲**:電腦會隨機產生 2 個 1 到 7 之間不重複的數字,玩家最多有 3 次機會輸入 2 個數字來猜電腦的解答。 # 從 random 模組中匯入 randint 函式,用來產生指定範圍內的隨機整數 from random import randint # 建立一個空的集合 (Set) 變數 pc,用來儲存電腦產生的答案(利用集合不重複的特性) pc = set() # 當 pc 集合內的元素個數小於 2 個時,持續執行迴圈 while (len(pc) < 2): # 產生一個 1 到 7 之間的隨機整數,並加入 pc 集合中 # 如果抽到重複的數字,集合會自動忽略,直到湊滿 2 個不重複的數字才會結束迴圈 pc.add(randint(1, 7)) print(f'電腦已經選好號碼了 {pc},請輸入兩個 1~7 的號碼,總共有三次機會') # 建立變數 count 並設定初始值為 3,代表玩家最多有 3 次猜題機會 count = 3 # 當 count 大於 0 時(在 Python 中非零數字視為 True),持續執行猜題迴圈 while (count): # 建立一個空的集合 you,用來儲存玩家這次輸入的 2 個數字 you = set() # 當玩家輸入的有效數字還不到 2 個時,持續提示輸入 while (len(you) < 2): # 提示玩家輸入數字,使用 f-string 顯示目前是輸入第幾個號碼(1 或 2),並用 int() 轉為整數 x = int(input (f'請輸入第 {len(you) + 1} 個號碼:')) # 檢查玩家輸入的數字是否在 1 到 7 的有效範圍內 (1 <= x <= 7) if(x <= 7 and x > 0): #若符合範圍則加入 you 集合中(若輸入重複數字,集合長度不會增加,會要求重填) you.add(x) # 比較電腦答案(pc) 與玩家輸入(you) 是否完全相同(集合比較不看順序,只看元素是否一致) if(pc == you): # 如果兩者集合相同,印出「答對了」 print('答對了') # 強制跳出最外層的 while 迴圈,提前結束遊戲 break # 若答案不符合,印出「答錯了」 print('答錯了') # 將剩餘次數 count 減 1,繼續進行下一次嘗試,直到 count 扣到 0 為止 count -= 1
[結果]
請輸入第 1 個號碼 : 1
請輸入第 2 個號碼 : 2
答錯了
請輸入第 1 個號碼 : 3
請輸入第 2 個號碼 : 4
答對了相關主題與延伸閱讀
- 1. 元組:同屬容器資料結構,可比較元組的有序與集合的無序特性。
- 2. 字典:可比較字典鍵的唯一性與集合元素不重複的特性。
- 4. 元組、字典和集合的比較與使用時機:統整集合與元組、字典的選用時機。
- 4. 串列的函式與方法:集合常由串列轉換而來,用於資料去除重複。
- 5. 例外處理:使用
remove()刪除不存在的元素時會產生錯誤,可搭配例外處理。