今天,我們將介紹 Python 中非常重要的資料結構——集合(Set)。集合是一種無序且不允許重複元素的數據結構,這使它特別適合用來處理需要「唯一性」的數據問題。集合還具備非常高效的運算操作,像是聯集、交集和差集。
集合的定義
集合的基本語法
{}
或 set()
函數來創建。例如:
my_set = {1, 2, 3, 4}
another_set = set([3, 4, 5, 6])
空集合的創建
set()
而不是 {}
,因為 {}
預設為空字典:
empty_set = set()
新增元素
add()
方法向集合中添加元素:
my_set.add(5) # my_set 現在是 {1, 2, 3, 4, 5}
刪除元素
remove()
或 discard()
方法刪除元素。如果使用 remove()
刪除不存在的元素,會拋出錯誤;而 discard()
則不會:
my_set.remove(3) # my_set 現在是 {1, 2, 4, 5}
my_set.discard(6) # 不會拋出錯誤
集合的長度
len()
函數來取得集合中元素的數量:
print(len(my_set)) # 輸出: 4
清空集合
clear()
方法可以清空集合中的所有元素:
my_set.clear() # my_set 現在是 set()
檢查元素是否存在
in
關鍵字來檢查某個元素是否在集合中:
if 2 in my_set:
print("2 在集合中")
聯集(Union)
union()
或 |
來取得兩個集合的聯集,包含兩個集合的所有元素:
set_a = {1, 2, 3}
set_b = {3, 4, 5}
print(set_a.union(set_b)) # 輸出: {1, 2, 3, 4, 5}
print(set_a | set_b) # 同樣輸出 {1, 2, 3, 4, 5}
交集(Intersection)
intersection()
或 &
來取得兩個集合的交集,返回兩個集合中都存在的元素:
print(set_a.intersection(set_b)) # 輸出: {3}
print(set_a & set_b) # 同樣輸出 {3}
差集(Difference)
difference()
或 -
來取得差集,返回在集合 A 中但不在集合 B 中的元素:
print(set_a.difference(set_b)) # 輸出: {1, 2}
print(set_a - set_b) # 同樣輸出 {1, 2}
對稱差集(Symmetric Difference)
symmetric_difference()
或 ^
來取得兩個集合的對稱差集,返回兩個集合中彼此不相交的元素:
print(set_a.symmetric_difference(set_b)) # 輸出: {1, 2, 4, 5}
print(set_a ^ set_b) # 同樣輸出 {1, 2, 4, 5}
資料去重
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = set(numbers)
print(unique_numbers) # 輸出: {1, 2, 3, 4, 5}
資料庫中的聯集與交集操作
優點
缺點
這些實作練習主要練習 Python 中 集合(set
)的應用,集合是一個無序且不重複的數據結構,非常適合處理去重及集合運算。接下來我們將針對每個問題提供解答。
撰寫一個程式,讓使用者輸入一個含有重複元素的列表,並輸出去重後的集合。
def remove_duplicates(data_list):
return set(data_list)
# 測試程式
data_list = input("請輸入一組數據,用逗號分隔: ").split(',')
print(f"去重後的集合是: {remove_duplicates(data_list)}")
給定兩個隨機生成的數字集合,實現聯集、交集、差集和對稱差集的運算,並輸出結果。
import random
# 隨機生成兩個集合
set1 = set(random.sample(range(1, 20), 10))
set2 = set(random.sample(range(1, 20), 10))
print(f"集合 1: {set1}")
print(f"集合 2: {set2}")
# 集合運算
union_set = set1.union(set2)
intersection_set = set1.intersection(set2)
difference_set = set1.difference(set2)
symmetric_difference_set = set1.symmetric_difference(set2)
# 輸出結果
print(f"聯集: {union_set}")
print(f"交集: {intersection_set}")
print(f"差集 (set1 - set2): {difference_set}")
print(f"對稱差集: {symmetric_difference_set}")
撰寫一個程式,輸入兩個班級的學生名單,並使用集合來找出:
def student_analysis(class1, class2):
class1_set = set(class1)
class2_set = set(class2)
both_classes = class1_set.intersection(class2_set)
only_one_class = class1_set.symmetric_difference(class2_set)
all_students = class1_set.union(class2_set)
return both_classes, only_one_class, all_students
# 測試程式
class1 = input("請輸入班級 1 的學生名單,用逗號分隔: ").split(',')
class2 = input("請輸入班級 2 的學生名單,用逗號分隔: ").split(',')
both_classes, only_one_class, all_students = student_analysis(class1, class2)
print(f"同時參加兩個班級的學生: {both_classes}")
print(f"只參加其中一個班級的學生: {only_one_class}")
print(f"兩個班級的所有學生: {all_students}")
練習 1:我們使用 Python 的集合特性來去重。透過 set()
將列表轉換為集合,可以自動去除重複項目。
練習 2:利用集合的內建方法(如 union
, intersection
, difference
, symmetric_difference
)來進行集合運算。這些方法非常方便地幫助你處理集合之間的關係。
每日作業:在這個作業中,使用了 intersection()
來找出同時在兩個班級中的學生,symmetric_difference()
找出只在一個班級中的學生,而 union()
則將兩個班級的學生名單合併。
一張展示聯集、交集、差集和對稱差集的 Venn 圖,清楚表達各種集合運算之間的關係。
一張展示使用集合來去除列表中重複元素的實例圖,展示操作前後的數據對比。
集合是 Python 中一個非常有用的資料結構,特別適合用來處理那些需要「唯一性」的情況。透過今天的學習,你將能掌握集合的基本操作以及其應用場景。