不間斷 Python 挑戰 Day 18 - 集合 (Set)

更新於 發佈於 閱讀時間約 10 分鐘

Python提供集合做為其資料結構,它就如同高中數學所學集合的概念,集合的內容一般來說是具有某種特性的事物的整體,例如考試分數及格的群體、數字1到100內的所有奇數、球箱內所有球的顏色等。因此,在一個集合中,每個元素的地位都是相同且無序,並且只能出現一次,集合和集合之間,也可以進行交集、聯集、差集等的操作。集合的元素必須是不可變的(immutable),也就是當該元素的物件被創造出來後,值沒辦法被改變,若修改其值會創造出一個新的物件,例如整數(int)、浮點數(float)、字串(string)、元組(tuple)等;可變的(mutable)物件則不能做為集合的元素,例如串列(list)、字典(dict)、集合(set)等。

集合

集合可以使用大括號「{ }」或是set()函數來建立。使用大括號時和字典類似,但只有鍵,沒有值,例如以下建立一個台灣直轄市的集合:

cities_set = {"台北市", "新北市", "桃園市", "台中市", "台南市", "高雄市"}
print(cities_set)
print(type(cities_set))

執行結果:

{'高雄市', '台北市', '台中市', '桃園市', '台南市', '新北市'}
<class 'set'>

前面提過集合中的元素只能出現一次,重複出現的元素會被自動刪除,例如:

cities_set = {"台北市", "新北市", "新北市", "桃園市", "台中市", "台南市", "高雄市"}
print(cities_set)

執行結果:

{'台中市', '台北市', '高雄市', '桃園市', '台南市', '新北市'}

使用set()函數建立集合的方式如下:

  • 內容為字串:
str_set = set("This is my marathon Python challenge.")
print(str_set)

執行結果,注意重複的字母只會出現一次:

{'o', 'r', 's', 'y', 'P', 'e', 'm', 'i', '.', 'n', 't', 'a', 'c', ' ', 'l', 'g', 'h', 'T'}
  • 內容為串列,將被轉換為集合:
list_set = set(["台北市", "新北市", "桃園市", "台中市", "台南市", "高雄市"])
print(list_set)

執行結果:

{'新北市', '高雄市', '台北市', '台中市', '台南市', '桃園市'}
  • 內容為字典,其鍵將被轉換為集合,其值會被忽略:
dict_set = set({"台北市": 2531659, "新北市": 4011586, "桃園市": 2272452, "台中市": 2814422, "台南市": 1863435, "高雄市": 2746939})
print(dict_set)

執行結果:

{'台中市', '台南市', '台北市', '新北市', '桃園市', '高雄市'}
  • 內容為元組,將被轉換為集合:
tuple_set = set(("台北市", "新北市", "桃園市", "台中市", "台南市", "高雄市"))
print(tuple_set)

執行結果:

{'新北市', '高雄市', '台北市', '台中市', '台南市', '桃園市'}

空集合

空集合的建立方式只能使用set()函數,若使用大括號則和建立空字典的方式相同,會被Python認為是字典的資料型態。

empty_set = {}
print(type(empty_set))

empty_set = set()
print(type(empty_set))

執行結果:

<class 'dict'>
<class 'set'>

增加與刪除集合元素

集合元素的內容是不可變的,但集合的元素可以被增加或刪除。

  • 使用add()方法來增加集合的元素
cities_set.add("新竹市")
print(cities_set)

執行結果:

{'台中市', '新竹市', '高雄市', '桃園市', '新北市', '台南市', '台北市'}
  • 使用remove()方法來刪除集合的元素
cities_set.remove("新竹市")
print(cities_set)

執行結果:

{'台中市', '台北市', '高雄市', '新北市', '桃園市', '台南市'}

集合的操作(聯集、交集、差集、對稱差集)

聯集(Union)

假設有A、B兩個集合,若想取得A、B兩集合內的所有元素可以使用聯集,Python的運算子符號為「|」。例如以下例子:A集合是3的倍數、B集合是5的倍數,則A、B聯集為3的倍數或5的倍數。

A_set = {3, 6, 9, 12, 15}
B_set = {5, 10, 15}
AB_union = A_set | B_set
print(AB_union)

執行結果:

{3, 5, 6, 9, 10, 12, 15}

交集(Intersection)

假設有A、B兩個集合,若想取得A、B兩集合內共同存在的元素可以使用交集,Python的運算子符號為「&」。承上範例,A、B聯集為3與5的公倍數。

A_set = {3, 6, 9, 12, 15}
B_set = {5, 10, 15}
AB_intersection = A_set & B_set
print(AB_intersection)

執行結果:

{15}

差集(difference)

假設有A、B兩個集合,若想取得屬於A集合但不屬於B集合的元素可以使用差集,Python的運算子符號為「-」。承上範例,A、B差集為3的倍數但不為5的倍數。

A_set = {3, 6, 9, 12, 15}
B_set = {5, 10, 15}
AB_difference = A_set - B_set
print(AB_difference)

執行結果:

{9, 3, 12, 6}

對稱差集(symmetric difference)

假設有A、B兩個集合,若想取得屬於A集合或是B集合的元素,但排除同時屬於A集合和B集合的元素,可以使用對稱差集,Python的運算子符號為「^」。承上範例,A、B的對稱差集為3的倍數或5的倍數,但不為3和5的公倍數。

A_set = {3, 6, 9, 12, 15}
B_set = {5, 10, 15}
AB_sym_difference = A_set ^ B_set
print(AB_sym_difference)

執行結果:

{3, 5, 6, 9, 10, 12}

子集合(subset)與父集合(superset)

假設有A、B兩個集合,若A集合的所有元素都存在於B集合,則稱A集合為B集合的子集合、B集合為A集合的父集合,Python用來判斷是否為子集合的函數為issubset()、用來判斷是否為父集合的函數為issuperset(),若相等則傳回True、不相等則傳回False。

A_set = {3, 6, 9, 12, 15}
B_set = {3, 5, 6, 9, 10, 12, 15}
print(f"Is A_set a subset of B_set? {A_set.issubset(B_set)}")
print(f"Is B_set a superset of A_set? {B_set.issuperset(A_set)}")

執行結果:

Is A_set a subset of B_set? True
Is B_set a superset of A_set? True

相等集合

Python用來判斷兩集合是否相等的運算子符號為「==」,若相等則傳回True、不相等則傳回False。

A_set = {3, 6, 9, 12, 15}
B_set = {3, 5, 6, 9, 10, 12, 15}
C_set = {3, 6, 9, 12, 15}
print(f"Is A_set the same as B_set? {A_set == B_set}")
print(f"Is A_set the same as C_set? {A_set == C_set}")

執行結果:

Is A_set the same as B_set? False
Is A_set the same as C_set? True

使用for迴圈迭代

集合可以使用for迴圈迭代,但必須記得集合是無序的資料結構,不能使用索引值來取值。

for city in cities_set:
  print(city, end=" ")

執行結果:

高雄市 桃園市 台南市 新北市 台北市 台中市 

集合生成

集合和for迴圈結合,可以簡潔的方式產生元組,例如前面例子的A_set,我們手動鍵入1到15範圍內的3的倍數,其實也可以這樣產生:

A_set = {num for num in range(1, 16) if num % 3 == 0}
print(A_set)

執行結果:

{3, 6, 9, 12, 15}

程式範例

本文程式範例收錄於:
https://github.com/wjweng/marathon_python/blob/master/Day1_to_25/marathon_python_day18.py

留言
avatar-img
留言分享你的想法!
avatar-img
Wei-Jie Weng的沙龍
48會員
36內容數
Wei-Jie Weng的沙龍的其他內容
2022/07/13
對於程式的初學者而言,理解程式的流程、迴圈的進行、或是變數的變化會需要一定程度將程式在腦中進行運算的能力,要一段時間熟悉與適應,尤其是當程式執行的結果不如預期時,往往是計算的過程和自己所想像的不同,這時又更難靠自己的能力找出錯誤。因此,這邊要介紹的這個工具可以將程式執行的過程逐行將變數的變化視覺化地
Thumbnail
2022/07/13
對於程式的初學者而言,理解程式的流程、迴圈的進行、或是變數的變化會需要一定程度將程式在腦中進行運算的能力,要一段時間熟悉與適應,尤其是當程式執行的結果不如預期時,往往是計算的過程和自己所想像的不同,這時又更難靠自己的能力找出錯誤。因此,這邊要介紹的這個工具可以將程式執行的過程逐行將變數的變化視覺化地
Thumbnail
2022/07/13
在上一節介紹了 JSON 資料的基本架構後,我們將改寫並擴充密碼產生器程式,讓它能夠藉由 JSON 的資料結構完成帳密搜尋的功能。
Thumbnail
2022/07/13
在上一節介紹了 JSON 資料的基本架構後,我們將改寫並擴充密碼產生器程式,讓它能夠藉由 JSON 的資料結構完成帳密搜尋的功能。
Thumbnail
2022/06/23
JSON的全名叫JavaScript Object Notation,是由Douglas Crockford所設計的一種資料格式,最初應用在JavaScript程式語言中,做為一種資料交換的格式,而後被廣泛運用在Web開發與NoSQL資料庫,現今已成為一種重要的資料格式。
Thumbnail
2022/06/23
JSON的全名叫JavaScript Object Notation,是由Douglas Crockford所設計的一種資料格式,最初應用在JavaScript程式語言中,做為一種資料交換的格式,而後被廣泛運用在Web開發與NoSQL資料庫,現今已成為一種重要的資料格式。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
Dictionary 字典 和 Set 集合 字典(Dictionary)是 Python 中一個常用的資料結構,用於儲存一組鍵值對(Key-Value pairs)。集合(Set)是 Python 中的一種無序、可變的資料結構,用於存儲多個元素,且集合中的元素是唯一的(不重複)
Thumbnail
Dictionary 字典 和 Set 集合 字典(Dictionary)是 Python 中一個常用的資料結構,用於儲存一組鍵值對(Key-Value pairs)。集合(Set)是 Python 中的一種無序、可變的資料結構,用於存儲多個元素,且集合中的元素是唯一的(不重複)
Thumbnail
在 Python 中,集合(Set)是一種重要的資料結構,它提供了一個無序、不可重複元素的集合容器。Set 具有強大的數學運算功能,並且在處理需要去除重複元素或進行成員檢查的情況下非常有用。
Thumbnail
在 Python 中,集合(Set)是一種重要的資料結構,它提供了一個無序、不可重複元素的集合容器。Set 具有強大的數學運算功能,並且在處理需要去除重複元素或進行成員檢查的情況下非常有用。
Thumbnail
Python提供集合做為其資料結構,它就如同高中數學所學集合的概念,集合的內容一般來說是具有某種特性的事物的整體,例如考試分數及格的群體、數字1到100內的所有奇數、球箱內所有球的顏色等。因此,在一個集合中,每個元素的地位都是相同且無序,並且只能出現一次,集合和集合之間,也可以進行交集、聯集、差集等
Thumbnail
Python提供集合做為其資料結構,它就如同高中數學所學集合的概念,集合的內容一般來說是具有某種特性的事物的整體,例如考試分數及格的群體、數字1到100內的所有奇數、球箱內所有球的顏色等。因此,在一個集合中,每個元素的地位都是相同且無序,並且只能出現一次,集合和集合之間,也可以進行交集、聯集、差集等
Thumbnail
在前面的文章中我們學習了關於字典的基本用法,今天再討論更多關於字典的其它用法,以及它和串列、元組等的關聯。
Thumbnail
在前面的文章中我們學習了關於字典的基本用法,今天再討論更多關於字典的其它用法,以及它和串列、元組等的關聯。
Thumbnail
在程式設計中,我們會使用到一些固定不會變動的資料內容,例如一年的月份、物體的邊長、過去一周的氣溫等等,使用串列的結構固然也可以用來儲存這些資料,但串列可以被新增或刪除,不能有效保護這類不可變動的資料。因此,Python也提供了另一種形式的資料結構,稱為元組,它的資料結構和串列相同,但資料的內容不可變
Thumbnail
在程式設計中,我們會使用到一些固定不會變動的資料內容,例如一年的月份、物體的邊長、過去一周的氣溫等等,使用串列的結構固然也可以用來儲存這些資料,但串列可以被新增或刪除,不能有效保護這類不可變動的資料。因此,Python也提供了另一種形式的資料結構,稱為元組,它的資料結構和串列相同,但資料的內容不可變
Thumbnail
當我們查字典時,會先找到想查詢的單字在字典裡的位置,才能在那個位置找到單字的定義;在Python中,也有一個類似的資料結構稱作字典,字典的鍵(key)就對應到我們要查詢的單字,字典的值(value)則是該單字的定義。
Thumbnail
當我們查字典時,會先找到想查詢的單字在字典裡的位置,才能在那個位置找到單字的定義;在Python中,也有一個類似的資料結構稱作字典,字典的鍵(key)就對應到我們要查詢的單字,字典的值(value)則是該單字的定義。
Thumbnail
當我們需要重複一系列有規則的行為,例如從1加到100,或是取得物件裡面的每一個元素,例如將串列裡面的每個元素印出,重複地撰寫程式碼顯然不切實際,for迴圈便是可以讓程式對可迭代物件(iterable object)執行迭代(iteration)的工具。
Thumbnail
當我們需要重複一系列有規則的行為,例如從1加到100,或是取得物件裡面的每一個元素,例如將串列裡面的每個元素印出,重複地撰寫程式碼顯然不切實際,for迴圈便是可以讓程式對可迭代物件(iterable object)執行迭代(iteration)的工具。
Thumbnail
前面提到變數為程式儲存資料的地方,一個變數可以儲存一個學生的成績、一個人的身高、或是一個人名等,但如果多人的資料要管理,為每個人設計一個變數顯然就有點不切實際,串列就是用來解決這樣的問題。
Thumbnail
前面提到變數為程式儲存資料的地方,一個變數可以儲存一個學生的成績、一個人的身高、或是一個人名等,但如果多人的資料要管理,為每個人設計一個變數顯然就有點不切實際,串列就是用來解決這樣的問題。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News