set

set是用花括號{}包起來。
裡面的元素用逗號分開,不重覆,不按照順序。
語法:

{元素, 元素, 元素}

元素類型

Python 的 set(集合)只能儲存可雜湊(Hashable)且不可變(Immutable)的資料型別。元素只能數字、字串、元組(Tuple)等作為元素存入,但不能包含列表(List)、字典(Dictionary)或另一個集合(Set)等「可變類型」。每個元素必須是唯一的,使用雜湊表(Hash Table)實現高效率的尋找與去重。

以下範例元素為字串、數字、元組Tuple。

1
2
set1 = {'blue', 'red', 100, (1, 2, 3)}
print(set1)
{'blue', 'red', 100, (1, 2, 3)}

使用list與dict會編譯錯誤。

1
2
set1 = {'blue', 'red', 100, [1, 2, 3]}
print(set1)
    set1 = {'blue', 'red', 100, [1, 2, 3]}
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: unhashable type: 'list'

可變與不可變

可變為可以修改、刪除。
不可變為不可以修改,也不可以刪除,只能讀取。

字串不可以修改,無法透過索引修改字串的單字。
以下程式碼會編譯錯誤。

1
2
str1 = "Hello"
st1[0] = "A"

不重覆

下方程式碼,有二個red,但執行之後,只有存一個red。
如果要去掉重覆元素,可以使用set。

1
2
set1 = {'blue','red','red'}
print(f"set1: {set1}, type(set1): {type(set1)}")
set1: {'red', 'blue'}, type(set1): <class 'set'>

元素無索引位置 無順序

以下的執行結果,是red先開始,再100,最後才是blue,跟宣告set的元素順序不同。

1
2
3
set1 = {'blue', 'red', 100}
for elem in set1:
    print(elem)
red
100
blue

因為set的元素取出是沒有順序,沒辦法使用索引來取得元素。
以下執行時會錯誤。

1
2
set1 = {'blue', 'red', 100}
print(set1[0])

也無法使用while迴圈,因為沒辦法使用索引來取得元素。

空set()

要宣告空的set,只能使用set(),不能呼叫花括號{},因為花括號是建立空的dict。

1
2
set1 = set()
print(f"set1: {set1}, type(set1): {type(set1)}")
set1: set(), type(set1): <class 'set'>

set操作函式

len()

元素數量。

1
2
set1 = {'blue', 'red', 100}
print(len(set1))
3

obj in set

判斷set是否有obj,回傳值為True或False。

1
2
3
set1 = {'blue', 'red', 100}
print('blue' in set1)
print(100 in set1)
True
True

set.add(obj) 新增

把obj新增至set中。

1
2
3
set1 = {'blue', 'red', 100}
set1.add(55.5)
print(set1)
{100, 55.5, 'blue', 'red'}

set.remove(obj) 刪除

1
2
3
set1 = {'blue', 'red', 100}
set1.remove(100)
print(set1)
{'blue', 'red'}

若無obj元素,會產生KerError。

1
2
3
set1 = {'blue', 'red', 100}
set1.remove(1)
print(set1)
    set1.remove(1)
KeyError: 1

pop 取出元素並刪除元素

pop會刪除元素,所以再遍歷一次set,就會少一個元素。

1
2
3
4
set1 = {'blue', 'red', 100}
elem = set1.pop() # 取出元素並刪除元素
print(f"elem = {elem}, type = {type(elem)}")
print(f"set1: {set1}")
elem = blue, type = <class 'str'>
set1: {100, 'red'}

union 合併

union可以合併二個set,並且產生新的set。

1
2
3
4
set1 = {"a", "b", "c"}
set2 = {1, 2, 3}
set3 = set1.union(set2)
print(set3)
{1, 'c', 'b', 2, 3, 'a'}

以下的程式碼,跟上面的程式碼是相同的。

1
2
3
4
set1 = {"a", "b", "c"}
set2 = {1, 2, 3}
set3 = set1 | set2
print(set3)

intersection 交集

取出二個集合set中,共同擁有的元素。

1
2
3
4
set1 = {"a", "b", "c"}
set2 = {"d", "a", "b"}
set3 = set1.intersection(set2)
print(set3)
{'b', 'a'}

以下的程式碼,跟上面的程式碼是相同的。

1
2
3
4
set1 = {"a", "b", "c"}
set2 = {"d", "a", "b"}
set3 = set1 & set2
print(set3)

difference 差集

二個集合把相同的元素刪掉,傳回前一個集合剩下的元素。

前一個集合 - 後面的集合 = 去掉相同元素,傳回前一個集合剩下的元素。

以下程式碼,a與b是二個集合共同擁有,set1刪掉a、b,傳回剩下的c。

1
2
3
4
set1 = {"a", "b", "c"}
set2 = {"d", "a", "b"}
set3 = set1 - set2
print(set3)
{'c'}

以下程式碼,跟上面的程式碼是相同的。

1
2
3
4
set1 = {"a", "b", "c"}
set2 = {"d", "a", "b"}
set3 = set1.difference(set2)
print(set3)

若把set2作為「前一個集合」去減 set1,會傳回set2扣掉相同元素後,set2剩下的元素。

1
2
3
4
set1 = {"a", "b", "c"}
set2 = {"d", "a", "b"}
set3 = set2 - set1
print(set3)
{'d'}

Comprehension運算式 建立set

由於set是無順序,產生出來的set,不會按照下圖的順序產生。

img

1
2
set1 = {elem * elem for elem in [1, 2, 3, 4]}
print(set1)
{16, 1, 4, 9}

results matching ""

    No results matching ""