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}