CH7-1 set物件基礎


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'}
#Python






你可能感興趣的文章

MTR04_0630

MTR04_0630

JS30 Day 18 筆記

JS30 Day 18 筆記

CSS保健室|font-display

CSS保健室|font-display






留言討論