set 集合物件基本介紹
前言
set 和 dict為容器物件。其中, set
負責儲存不重複的資料,dict
則可以更彈性的使用 key/value 對應方式來儲存資料,在未來開發更進階的應用程式時會經常使用到。
set 集合物件基本介紹
set 是一種不重複的無順序序列,常用於計算不重複值的數量,跟 list 和 dict 一樣也是一種可變物件(mutable)。
以產生 set 的主要兩種方式,使用 {} 和 set()
(注意:若是要產生空集合僅能使用 set(),{} 僅能使用在已有元素情況)
language = {'Python','Java'}
print(type(language))
#<class 'set'>
set是儲存不重複值
,見下方:
language = {'Python','Java','Java','Python'}
print((language))
#{'Java', 'Python'} 去掉重複值,且順序出現不同,因set是'無序'集合。
無序集合 set
Python中的set
是一個無序的集合,這意味著元素的存儲順序是不確定的,並且在每次運行時可能會有所不同。
因set
是基於散列(hash)
實現的,其內部使用了哈希表來存儲元素(key/value 鍵值對應)。哈希表並不保留元素的插入順序
,而是根據元素的哈希值將它們存儲在內部的桶(bucket)中。
如果需要有序的集合,可以使用 Python 的list
。這種資料儲存方式可以保留元素的插入順序:
language2 = ['Python','Java','Java','Python']
print((language2))
#['Python', 'Java', 'Java', 'Python']
#list保留了所有元素,並且按照順序插入
隨堂練習:建立set物件
請使用兩種不同方式建立元素為 'Tom', 'Leo', 'Jack', 'Leo', 'Amy' 的 set 物件。
set無序:
name1 = {'Tom', 'Leo', 'Jack', 'Leo', 'Amy'}
print(name1)
#{'Tom', 'Jack', 'Leo', 'Amy'}
#將串列[]轉set
ame2 = set(['Tom', 'Leo', 'Jack', 'Leo', 'Amy'])
print(name2)
for 迴圈基礎
用途:重複執行或是把可迭代物件(Iterators,ex. set, list, dict 等)內的元素一個一個取出來。寫法如下:
for 變數名稱 in 可迭代物件(Iterators,ex. set, list, dict 等):
程式區塊
eg:
name = {'Tom', 'Leo', 'Jack', 'Leo', 'Amy'}
for item in name:
print(item)
#Jack
Amy
Leo
Tom
for person in name:
print('hello '+ person)
#hello Leo
hello Tom
hello Amy
hello Jack
for迴圈
會在可迭代對象中的所有元素都被迭代完畢時跳出迴圈。
set 物件基本操作: 交集、聯集、差集和對稱差
my_languages = {'Python', 'C', 'C++'}
your_languages = {'Python', 'Java', 'JavaScript', 'C'}
1.交集 (&): 包含兩個集合中「共同的元素」
print(my_languages & your_languages)
#{'Python', 'C'}
2.聯集 (|): 包含兩個集合中所有的「不重複元素」
print(my_languages|your_languages)
也可以此方式表達:
union_reslut = my_languages.union(your_languages)
print(union_reslut)
#{'Python', 'C', 'C++', 'Java', 'JavaScript'}。
3.差集 (-): 包含「存在於第一個集合但不存在於第二個集合的元素」
print(my_languages-your_languages)
#{'C++'}
4.對稱差 (^): 包含「存在於其中一個集合但不存在於兩個集合都有的元素」
print(my_languages^your_languages)
#{'Java', 'JavaScript', 'C++'}
隨堂練習:交集、聯集、差集和對稱差
請印出 my_numbers = {1, 5, 6, 9},your_numbers = {1, 3, 5, 7} 的交集、聯集、差集和對稱差。
1.交集(&)
print(my_numbers & your_numbers)
#{1,5}
2.聯集(.union/|)
print(my_numbers | your_numbers)
#{1,3,5,6,7,9}
3.差集(-)
print(my_numbers - your_numbers)
#{9,6}
4.對稱差(^)
print(my_numbers ^ your_numbers)
#{3,6,7,9}
set 的一些操作
1.新增/移除元素
使用 add()
來新增單一元素,透過 update()
來新增多個元素(新增內容可以是 list、tuple 或 dict):
my_numbers = {1, 5}
my_numbers.add(6)
print(my_numbers)
#{1, 5, 6}
透過空集合set()
來新增:
my_numbers = set()
my_numbers.add(1)
my_numbers.add(6)
print(my_numbers)
# {1,6}
透過update()
新增多個元素:
my_numbers = {2}
my_numbers.update([1,6,5,7,9])
print(my_numbers)
使用remove()
移除指定元素:
names = {'Tom', 'Jack', 'Leo', 'Amy'}
names.remove('Tom')
print(names)
#{'Jack', 'Amy', 'Leo'}
隨堂練習:新增/移除set元素:
新增:
names = set()
names.update(['Tom', 'Jack', 'Leo', 'Amy'])
print(names)
#{'Jack', 'Amy', 'Tom', 'Leo'}
移除:
names = {'Tom','Jack','Leo','Amy'}
names.remove('Tom')
print(names)
使用clear()清空集合"
names = {'Tom','Jack','Leo','Amy'}
names.clear()
print(names)
#set()
計算長度
使用 len() 計算長度(元素個數):
{'Tom','Jack','Leo','Amy'}
print(len(names))
#4
判斷元素是否在集合內
使用 in 判斷元素是否在集合內:
names = {'Tom','Jack','Leo','Amy'}
print('Tom' in names)
#true
隨堂練習:計算交集元素個數
在公司的顧客購物資料中有兩份使用者購物清單字串如下,請透過字串函式操作將字串物件轉換成集合結構,取兩者的交集
並回傳其個數:
user_1 = 'potato,macbook,ring'
user_2 = 'iphone,macbook,airpod,book'
字串轉集合:
user_1 = {'potato,macbook,ring'}
user_2 = {'iphone,macbook,airpod,book'}
交集個數:
print(len(user_1 & user_2))
#0
排序
set 是無序
排列(在數學和程式語言中 {'A', 'B', 'C'} 和 {'C', 'B', 'A'} 是指同一個 set),所以沒有順序性,所以必須轉成 list 才能進行排序。
若要透過 list 排序可以使用 sorted(set)
其會回傳排序好的 list,且不會影響到原來的 set 物件(以下範例為根據元素內容首字字母排序
):
names = set()
names.update(['tom', 'jack', 'leo', 'amy'])
預設為降冪:
print(sorted(names))
#['amy', 'jack', 'leo', 'tom']
設定為升冪:
print(sorted(names, reverse=True))
#['tom', 'leo', 'jack', 'amy']
set Comprehension 生成式
expression for item in iterable
其中:
1.expression 是根據 item 而計算出的表達式或值。
2.item 是迭代的變數,代表 iterable 中的每一個元素。
3.iterable 是被迭代的對象,可以是列表、集合、字典的鍵、範圍等。
生成式通常用於進行一些較為複雜的操作,並創建具有唯一性的序列
,如過濾功能:
# 使用生成式,只保留名字的長度大於等於 3 的元素
filtered_names = {x for x in ['Leo', 'Tom', 'Jack', 'Sam'] if len(x) >= 3}
print(filtered_names)
#{'Leo', 'Tom', 'Jack', 'Sam'}