Python - 集合

大家好,有志於成為Python程序設計師的你!今天,我們將深入探討Python集合的奇妙世界。作為你友善的鄰居電腦科學老師,我非常高興能夠引導你走過這段旅程。所以,拿起你最喜歡的飲料,放鬆一下,讓我們一起來探索集合吧!

Python - Sets

Python中的集合

想像一下你有一袋色彩繽紛的彈珠。每顆彈珠都是獨一無二的,你不在乎它們的順序 - 你只是想知道你有哪些顏色。這基本上就是Python中的集合!

集合是一個無序的獨特元素集合。它就像一個數學集合:不允許重複,且順序不重要。當你需要存儲獨特項目或執行集合操作(如聯合、交集和差異)時,集合非常有用。

在Python中創建集合

讓我們從創建我們的第一個集合開始。在Python中創建集合主要有兩種方法:

  1. 使用大括號 {}
  2. 使用set()構造函數

以下兩種方法的例子:

# 方法1:使用大括號
fruits = {'蘋果', '香蕉', '櫻桃'}

# 方法2:使用set()構造函數
colors = set(['紅色', '綠色', '藍色'])

print(fruits)
print(colors)

輸出:

{'櫻桃', '蘋果', '香蕉'}
{'藍色', '紅色', '綠色'}

注意,輸出中的元素順序可能与我們定義的順序不同。這是因為集合是无序的!

集合中的重複元素

記得我說過集合只包含獨特元素嗎?讓我們看看當我們試圖添加重複項目時會發生什麼:

numbers = {1, 2, 3, 2, 4, 3, 5}
print(numbers)

輸出:

{1, 2, 3, 4, 5}

如你所見,Python會自動為我們刪除重複項目。這不很棒嗎?

向集合中添加元素

要向集合中添加單個元素,我們使用add()方法。如果我們想一次添加多個元素,我們使用update()方法。

# 添加單個元素
fruits.add('橙子')
print(fruits)

# 添加多個元素
fruits.update(['葡萄', '芒果'])
print(fruits)

輸出:

{'櫻桃', '蘋果', '香蕉', '橙子'}
{'櫻桃', '芒果', '蘋果', '香蕉', '橙子', '葡萄'}

從集合中刪除元素

有幾種方法可以從集合中刪除元素。讓我們來探索它們:

# 使用remove() - 如果元素不存在則引發錯誤
fruits.remove('香蕉')

# 使用discard() - 如果元素不存在則不引發錯誤
fruits.discard('奇異果')

# 使用pop() - 刪除並返回一個任意元素
popped = fruits.pop()
print(f"彈出的元素:{popped}")

# 使用clear() - 刪除所有元素
fruits.clear()

print(fruits)

輸出:

彈出的元素:櫻桃
set()

集合中的成員測試

集合的一個好處是它們允許非常快速的成員測試。我們可以使用in關鍵字來檢查元素是否存在於集合中:

numbers = {1, 2, 3, 4, 5}
print(3 in numbers)  # True
print(6 in numbers)  # False

對於大型集合,這種操作使用集合比使用列表要快得多!

集合操作

Python的集合支持各種數學集合操作。讓我們看看其中的一些:

set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# 聯合
print(set1 | set2)  # 或者set1.union(set2)

# 交集
print(set1 & set2)  # 或者set1.intersection(set2)

# 差異
print(set1 - set2)  # 或者set1.difference(set2)

# 對称差異
print(set1 ^ set2)  # 或者set1.symmetric_difference(set2)

輸出:

{1, 2, 3, 4, 5, 6, 7, 8}
{4, 5}
{1, 2, 3}
{1, 2, 3, 6, 7, 8}

Python集合解析

就像列表解析一樣,Python也支持集合解析。它們提供了一種簡潔的方法,基於現有的可迭代對象創建集合。

# 創建一個包含0到9的數字的平方的集合
squares = {x**2 for x in range(10)}
print(squares)

輸出:

{0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

使用集合解析過濾元素

我們也可以使用集合解析來過濾元素:

# 創建一個包含0到9的偶數平方的集合
even_squares = {x**2 for x in range(10) if x % 2 == 0}
print(even_squares)

輸出:

{0, 4, 16, 36, 64}

嵌套集合解析

雖然較少見,但嵌套集合解析也是可能的:

# 創建一個包含數字對(x, y)的集合,其中x和y都是數位
digit_pairs = {(x, y) for x in range(3) for y in range(3)}
print(digit_pairs)

輸出:

{(0, 1), (1, 2), (0, 0), (2, 0), (1, 1), (2, 2), (0, 2), (2, 1), (1, 0)}

冻結集合

最後但並非最不重要,讓我們談談 冻結集合。一個 冻結集合是一個Python集合對象的不可變版本。當集合的元素可以隨時修改時, 冻結集合的元素在創建後保持不變。

normal_set = {1, 2, 3}
frozen_set = frozenset([1, 2, 3])

normal_set.add(4)  # 這可以工作
# frozen_set.add(4)  # 這會引發屬性錯誤

當你需要一個不可變的集合,例如將其用作字典鍵時, 冻結集合特別有用。

就是這樣,各位!我們已經涵蓋了Python集合的方方面面。記住,熟練才能完美,所以不要猶豫去嘗試這些概念。編程愉快!

以下是我們討論的主要集合方法的摘要表:

方法 描述
add() 向集合中添加元素
update() 向集合中添加多個元素
remove() 從集合中刪除特定的元素(如果找不到則引發錯誤)
discard() 從集合中刪除特定的元素(如果找不到則不引發錯誤)
pop() 從集合中刪除並返回一個任意元素
clear() 刪除集合中的所有元素
union() 返回包含集合聯合的集合
intersection() 返回包含集合交集的集合
difference() 返回包含集合差異的集合
symmetric_difference() 返回包含在集合中但不同時在兩個集合中的元素的集合

Credits: Image by storyset