Python Set (集合)
Set 是無序且不重複的元素集合。Set 常用於去除重複元素、成員測試和集合運算(聯集、交集等)。
建立 Set
使用大括號 {} 或 set() 函數建立 Set:
# 使用大括號
fruits = {"apple", "banana", "orange"}
# 使用 set() 函數
numbers = set([1, 2, 3, 4, 5])
# 建立空的 set(不能用 {},那是空字典)
empty_set = set()
Set 的特性
元素不重複
numbers = {1, 2, 2, 3, 3, 3, 4}
print(numbers) # {1, 2, 3, 4}
# 常用於去除重複元素
my_list = [1, 2, 2, 3, 3, 3, 4]
unique = list(set(my_list))
print(unique) # [1, 2, 3, 4]
元素無序
Set 中的元素沒有固定順序,不能用索引存取:
fruits = {"apple", "banana", "orange"}
# print(fruits[0]) # TypeError!
# 但可以遍歷
for fruit in fruits:
print(fruit)
檢查元素是否存在
Set 的成員測試非常快速:
fruits = {"apple", "banana", "orange"}
print("apple" in fruits) # True
print("grape" in fruits) # False
print("grape" not in fruits) # True
Set 長度
fruits = {"apple", "banana", "orange"}
print(len(fruits)) # 3
新增和刪除元素
fruits = {"apple", "banana"}
# add() - 新增一個元素
fruits.add("orange")
print(fruits) # {'apple', 'banana', 'orange'}
# update() - 新增多個元素
fruits.update(["grape", "kiwi"])
print(fruits) # {'apple', 'banana', 'orange', 'grape', 'kiwi'}
# remove() - 刪除元素(不存在會報錯)
fruits.remove("banana")
print(fruits) # {'apple', 'orange', 'grape', 'kiwi'}
# discard() - 刪除元素(不存在不會報錯)
fruits.discard("mango") # 不會報錯
print(fruits)
# pop() - 隨機刪除並回傳一個元素
removed = fruits.pop()
print(removed)
# clear() - 清空 set
fruits.clear()
print(fruits) # set()
集合運算
a = {1, 2, 3, 4, 5}
b = {4, 5, 6, 7, 8}
聯集 (Union)
兩個集合的所有元素:
print(a | b) # {1, 2, 3, 4, 5, 6, 7, 8}
print(a.union(b)) # {1, 2, 3, 4, 5, 6, 7, 8}
交集 (Intersection)
兩個集合共有的元素:
print(a & b) # {4, 5}
print(a.intersection(b)) # {4, 5}
差集 (Difference)
在 a 中但不在 b 中的元素:
print(a - b) # {1, 2, 3}
print(a.difference(b)) # {1, 2, 3}
對稱差集 (Symmetric Difference)
只在其中一個集合中的元素(不同時存在於兩個集合):
print(a ^ b) # {1, 2, 3, 6, 7, 8}
print(a.symmetric_difference(b)) # {1, 2, 3, 6, 7, 8}
集合比較
a = {1, 2, 3}
b = {1, 2, 3, 4, 5}
c = {1, 2, 3}
# 子集合
print(a.issubset(b)) # True(a 是 b 的子集合)
print(a <= b) # True
# 超集合
print(b.issuperset(a)) # True(b 是 a 的超集合)
print(b >= a) # True
# 相等
print(a == c) # True
# 是否有交集
print(a.isdisjoint({4, 5})) # True(沒有交集)
Frozen Set
Frozen set 是不可變的 set,一旦建立就不能修改:
frozen = frozenset([1, 2, 3])
# frozen.add(4) # AttributeError!
# 因為是不可變的,可以作為 dict 的 key 或 set 的元素
my_dict = {frozen: "value"}
my_set = {frozen, frozenset([4, 5])}
Set Comprehension
# 建立平方數的 set
squares = {x ** 2 for x in range(5)}
print(squares) # {0, 1, 4, 9, 16}
# 加上條件
evens = {x for x in range(10) if x % 2 == 0}
print(evens) # {0, 2, 4, 6, 8}