# 容器(container) ## 一、 為什麼要使用容器? ### 1. 容器的概念 Python 中的容器(Containers)是指各種結構化數據類型。它們就像字面意思,可以用來裝各種東西。 有的容器有標籤,可以利用它快速取出容器裡的東西;有的容器不會儲存重複元素,可以用它得知容器內有哪些種類的物品。 下面介紹常見的四種容器,每個容器都有自己的特色和功能,學起來後就可以根據你的需要去選擇使用哪種容器儲存資料! ### 2. 容器的優點 #### 組織和存儲數據: 容器可以方便地存儲和組織數據,例如列表可以存儲一系列數據,字典可以用於存儲鍵值對,集合可以用於存儲一組唯一的數據等。 #### 容器操作方便: 容器支持許多常用的操作,例如遍歷、查找、排序、合併等,可以大大簡化編程。 #### 支持迭代: 容器支持迭代,可以使用 for 循環遍歷容器中的所有元素,這種方式比使用 while 循環遍歷更加簡潔和易於理解。 #### 可以容納不同類型的數據: 容器可以容納不同類型的數據,例如列表中可以同時存儲數字、字符串、布爾值等不同類型的數據。 #### 可以動態調整大小: 多數容器可以動態調整大小,可以添加、刪除或修改容器中的元素。少數容器無法自行修改元素,例如:元組(tuple) 總之,容器是 Python 編程中非常實用的數據類型,可以大大簡化編程,提高代碼的可讀性和可維護性。 ### 3.常見的容器類型和比較 |容器名稱 | 串列(list) | 元組(tuple) | 字典(dictionary) | 集合(set)| |-------| ---------- | ---------- | --------------- |-------- | |順序性 | 有 | 有 | 無 | 無| |可變性 | 有 | 無 | 有 | 有| ## 二、 List 串列 ### 1.特色 list就像可以拼接的箱子,每個箱子裡面放入一個元素。 拼接好的箱子會依序由0開始編號,如同下圖所示。![](https://i.imgur.com/2kH5z7Q.png) ### 2.優點 #### 儲存不同資料型態的元素: 同一個list可以存放像是int、string,或是容器等型態的東西。 ```python=1 list1 = [1, 2, 3, "apple", [4, 5, 6] ] print(list1) ``` #### 有順序: 每個元素都有自己的索引值(index),方便查找元素 #### 可以修改元素: 若想用其他元素取代原先元素,或是想要刪除該元素 ### 3.使用方法 #### 3.1宣告 ```python=1 #宣告空list: list名稱 = [ ] list_name = [] #宣告非空的list: list名稱 = [元素1,元素2, ...] list_name = ["string", 'c', 123] ``` #### 3.2修改元素 ```python=1 List [ index ] = value #修改單個元素: List[index_start : index_end ] = value1 , value2 , … #修改多個元素 ``` #### 3.3取得元素 ##### 索引值 * Index不小於零的表示方法:索引值從0開始,第一個元素index=0,第二個元素index=1⋯⋯第n個元素index=n-1。N個元素的index值從頭到尾分別是: 0 , 1 , 2 , 3 , … , n-1 * Index小於零的表示方法:最後一個元素的索引值為 -1,倒數第二個元素的索引值為 -2。N個元素的index值從頭到尾分別是: -n , -(n-1) , … ,-3 , -2 , -1 ##### 索引切片運算 ```python=1 [m:n:k] #取出索引值為m到索引值為n-1的元素。 ``` * m代表切片範圍的最小索引值位置,若m為空則默認為從索引值0開始。 * n代表切片範圍的最大索引值位置的下一個索引值,最多取到index = n-1 的元素,若n為空則默認到最後,包含最後一個元素。 * k代表間隔。「[ : : 2]」會取出索引值為0、2、4 …的元素;「[ : : -1 ]」會反轉容器內元素再按順序取出,依序為索引值為 -1、-2、-3、 …。若k為空則默認為1。 > 範例 ```python=1 list1 = [1,2,3,4,5] Print( list1 [ : ] ) Print( list1 [ 1 : 4 ] ) #會印出索引值為1到索引值為3的list1 Print( list1 [ : -1 ] ) #會印出索引值為0到索引值為 -2的list1 Print( list1 [ -3: -1] ) #會印出索引值為-3到索引值為-2的list1 ``` > 輸出 ```python=1 [1,2,3,4,5] [2,3,4] [1,2,3,4] [3,4] ``` ##### 取得元素 * 取出單個元素:List[n]可以取出第n+1個元素。 * 取出特定範圍元素:List[m:n]可以取出索引值為m到索引值為n-1的元素。 #### 3.4常見函式 > append(x):將x增加到list的最後方 ```python=1 list1=[1,2,3] #若X為元素:直接增加在最後方 list1.append(4) print(list1) #若X為list:在目標list最後一個index的空間存放完整的X list1.append( [5,6,7] ) print(list1) ``` > 輸出 ```python=1 [1, 2, 3, 4] [ 1, 2, 3, 4, [ 5, 6, 7]] ``` > extend(x):將x增加到list的最後方 * X為元素:直接增加在最後方 * X為list:將X list內所有元素一個一個放到目標list後方。例如: ```python=1 list1=[1,2,3] #若X為元素:直接增加在list1最後方 list1.extend(4) print(list1) #若X為list:將x內所有元素一個一個放到list1後方。 list1.extend( [5,6,7] ) print(list1) ``` > 輸出 ```python=1 [1, 2, 3, 4] [ 1, 2, 3, 4, 5, 6, 7] ``` > insert(n, x):在索引值為n的位置插入x元素 ```python=1 list1 = [1, 2, 3] # 在第二個位置插入4 list1.insert(1, 4) print(list1) ``` > 輸出 ```python=1 [1, 4, 2, 3] ``` > pop():pop():從list內彈出最後一個元素 ```python=1 list1 = [1, 2, 3] #彈出最後一個元素 list1.pop() print(list1) ``` > 輸出 ```python=1 [1, 2] ``` > pop(n):從list內彈出指定位置(索引值為n)的元素 ```python=1 list1 = [1, 2, 3, 4] #彈出第二個元素 list1.pop(1) print(list1) ``` > 輸出 ```python=1 [1, 3, 4] ``` > remove(x):從list內移除第一次出現值為x的元素。 ```python=1 list1 = [1, 2, 3, 2] #移除第一個出現的2 list1.remove(2) print(list1) ``` > 輸出 ```python=1 [1, 3, 2] ``` > reverse():反轉list內順序 ```python=1 list1 = [1, 2, 3] #反轉順序 list1.reverse() print(list1) ``` > 輸出 ```python=1 [3, 2, 1] ``` > sort():將list內元素由小到大重新排列。 ```python=1 list1 = [3, 1, 2] # 由小到大重新排列 list1.sort() print(list1) ``` > 輸出 ```python=1 [1, 2, 3] ``` > index(x):取得list中元素等於x的第一個索引值。 ```python=1 list1 = [1, 2, 3, 2] # 取得2第一次出現的索引值 index = list1.index(2) print(index) ``` > 輸出 ```python=1 1 ``` > len():查詢元素個數 ```python=1 list1 = [1, 2, 3] # 查詢元素個數 count = len(list1) print(count) ``` > 輸出 ```python=1 3 ``` > min(list):取得list中最小數值,前提是list中元素全部都為int型態。 ```python=1 list1 = [1, 2, 3] # 取得最小數值 min_num = min(list1) print(min_num) ``` > 輸出 ```python=1 1 ``` > max(list):取得list中最大數值,前提是list中元素全部都為int型態。 ```python=1 list1 = [5, 2, 9, 1, 7] max_value = max(list1) print(max_value) ``` > 輸出 ```python=1 9 ``` > count(n):計算n在list內出現次數。 ```python=1 list1 = [1, 2, 3, 2, 4, 2] count = list1.count(2) print(count) ``` > 輸出 ```python=1 3 ``` ### 4.應用 1. 順序排列 ```python=1 # 排序一組數據 data = [4, 2, 7, 5, 1, 3, 6] data.sort() print(data) # [1, 2, 3, 4, 5, 6, 7] ``` ## 三、 Tuple 數組 ### 1. 特色 Tuple不可以刪除或更改元素的值,只能刪除所有元素。建立tuple就像把內容刻在石碑上一樣,一旦完成就無法修改。 ![](https://i.imgur.com/S6Itj1u.png) 裡面的內容也會有順序之分 ![](https://i.imgur.com/eR8eQz8.png) ### 2. 優點 #### 保障資料安全: 可以保證 Tuple 內的元素在使用過程中不會被意外更改,使其更可靠、更安全。 #### 佔用內存少: Tuple在使用上佔用的內存比一般的容器少,是因為Tuple是immutable(不可變)的容器,一旦建立後其內容就無法再被修改,因此Python不需要為了支援修改的操作而保留額外的內存空間。相較之下,list是mutable(可變)的容器,需要保留額外的內存空間以支援新增、刪除等操作。 此外,Tuple也不需要像list一樣保留動態增長的空間,因為Tuple一旦建立後,其元素數量就不會再變化。而list需要保留額外的動態增長空間,以便在容器需要增加元素時可以快速擴展。 #### 高效率: Tuple 被儲存在連續的內存位置上,而且一旦建立,其大小和結構不會改變。這使得 Tuple 的存取速度非常快,甚至比 List 還快,因為 List 的元素可以隨時被更改,導致在存取時需要額外的計算和記憶體空間。 #### 有順序性: 每個元素都有自己的索引值(index),方便查找元素。 #### 可以儲存不同資料型態的元素: 像是int、string,或是其他list、tuple ### 3.使用方法 #### 3.1 宣告 注意宣告單一元素tuple時,後面必須加上逗號。若沒有逗號,所宣告的型態會是「元素1」的資料型態,而非一個tuple。 ```python=1 #宣告空tuple tuple名稱 = () #宣告單一元素tuple tuple名稱 = (元素1,) #有逗號 #宣告多個元素的tuple tuple名稱 = (元素1,元素2, …..) tuple名稱 = 元素1 , 元素2 ……. ``` #### 3.2 新增元素 不能使用list所用的append和insert,利用tuple和另一個tuple連接來新增元素。 * 加入單一元素: tuple名稱 += ( 元素1 ,) > 範例 ```python=1 tuple1 = (1, 2, 3) tuple1 += (4,) print(tuple1) ``` > 輸出 ```python=1 (1, 2, 3, 4) ``` * 加入多個元素: tuple名稱 += ( 元素1 , 元素2 , … , 元素n ) > 範例 ```python=1 tuple2 = (1, 2, 3) tuple2 += (4, 5, 6) print(tuple2) ``` > 輸出 ```python=1 (1, 2, 3, 4, 5, 6) ``` **需要注意的是,使用 += 加入元素後,原本的tuple不會被改變,而是創建一個新的tuple,因此在記憶體使用上需要額外注意。** #### 3.3 取得元素 (1) 利用索引值取出單個元素:tuple[n]可以取出第n+1個元素。 > 範例: ```python=1 t1 = (1, 2, 3, 4, 5) print(t1[2]) ``` > 輸出 ```python=1 3 # 因為索引值為2的元素為3 ``` (2) 利用所印值取出多個元素:tuple[m:n]可以取出索引值為m到索引值為n-1的元素。 > 範例 ```python=1 t1 = (1, 2, 3, 4, 5) print(t1[1:4]) ``` > 輸出 ```python=1 (2, 3, 4) # 因為索引值為1到3的元素為2, 3, 4 ``` (3) 利用變數取出元素,稱作**開箱(unpacking)** > 範例 ```python=1 tuple1 = ‘abc’ , ’def’ , ‘ghi’ a , b , c = tuple1 print(a) ``` > 輸出 ```python=1 ‘abc’ ``` 輸出結果會是 ’abc’,因為變數a代表tuple1的第一個元素。因此,若改成print(b)則輸出 ’def’ #### 3.4 常見函式 > Tuple(list名稱):把list內元素存在tuple內 ```python=1 list1 = [1, 2, 3] t1 = tuple(list1) print(t1) ``` > 輸出 ```python=1 (1, 2, 3) ``` > Tuple(string名稱):把string內每個字存在tuple內 ```python=1 str1 = "Hello, world!" t2 = tuple(str1) print(t2) ``` > 輸出 ```python=1 ('H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!') ``` > Index():index(x) 取得tuple中元素等於x的第一個索引值。 ```python=1 t1 = (1, 2, 3, 2) index = t1.index(2) print(index) ``` > 輸出 ```python=1 1 ``` > Len():取得tuple內元素數量 ```python=1 t1 = (1, 2, 3, 2) length = len(t1) print(length) ``` > 輸出 ```python=1 4 ``` > Del():del(tuple) 刪除整個tuple ```python=1 t1 = (1, 2, 3) del t1 print(t1) # 會出現NameError: name 't1' is not defined,因為t1已被刪除 ``` > 輸出 ```python=1 # 會出現NameError: name 't1' is not defined,因為t1已被刪除 ``` ### 4. 應用 #### 4.1 字典的鍵 tuple儲存的元素可以作為字典的鍵值,以下為幾個原因: * Tuple 是不可變的:字典的鍵值必須是不可變的,這是因為字典在內部使用哈希表來實現,哈希表中的鍵值必須是不可變的才能被哈希,而 Tuple 是不可變的,所以 Tuple 可以作為字典的鍵值。 * Tuple 可以被比較:Tuple 可以被比較,這意味著你可以對字典中的鍵值進行排序和查找。Tuple 的比較方式是從左到右逐個比較元素,直到找到不同的元素為止。 * Tuple 可以包含多個元素:Tuple 可以包含多個元素,這意味著你可以使用多個值作為一個鍵值,比如下面的例子中,我們使用一個包含兩個元素的 Tuple 作為字典的鍵值,這樣可以方便地表示一個人的姓名和年齡。 > 範例 ```python=1 #利用包含名稱和年齡的tuple作為字典的鍵 my_dict = {('John', 30): 'Software Engineer'} print(my_dict[('John', 30)]) ``` > 輸出 ```python=1 Software Engineer ``` #### 4.2 保護代碼 ```python=1 # 保護代碼 # 如果你有一個常數列表,你希望在整個程序中保護它不被修改 MY_CONSTANTS = (1, 2, 3, 4) ``` #### 4.3 不可變數據結構 Tuple 是不可變的,一旦被創建,就不能被修改,這使得 Tuple 可以用於表示不可變的數據結構,比如日期、時間等: ```python=1 # 不可變數據結構 t = (1, 2, 3) # t[0] = 4 # TypeError: 'tuple' object does not support item assignment birthday = (1990, 1, 1) # 不可變的生日日期 ``` #### 4.4 多個值的打包與解包 Tuple 可以用於把多個值打包成一個值,在需要的時候再進行解包,比如多個變量賦值: > 範例 ```python=1 # 打包與解包 t = (1, 2, 3) a, b, c = t # 解包 print(a, b, c) x = 4 y = 5 z = 6 t = x, y, z # 打包 print(t) ``` > 輸出 ```python=1 1 2 3 (4, 5, 6) ``` #### 4.5 函數返回多個值 Tuple 可以用於函數返回多個值,比如: > 範例 ```python=1 # 函數返回多個值 def get_name_and_age(): name = 'Alice' age = 25 return name, age name, age = get_name_and_age() print(name, age) ``` > 輸出 ```python=1 Alice 25 ``` ## 四、 Dictionary 字典 ### 1. 特色 元素包含**鍵(key)和值(value)**,key和value的關係就像圖片中的鑰匙和門。但value並不是門,而是門後空間裡所放的東西。 ![](https://i.imgur.com/h3mc7Xy.png) 鍵是唯一的,值不是唯一的。Key通常是int或string的型態;Value可以是任何的資料型態,像是int、string,或是其他list、tuple,dictionary… ### 2. 優點 #### 快速查找和存取: Dictionary 的儲存方式是使用 key 來索引對應的 value。獨一無二的key讓搜尋、查找和存取資料變得非常快速,特別是當資料量很大時,dictionary 可以大幅提升效率。 #### 可變容器: Dictionary 是一種可變容器,可以隨時新增、修改或刪除資料。這種特性可以讓資料庫或網路應用程式更容易的應對實際的需求。 #### 擴充性: Dictionary 支援多層嵌套,也就是說可以在一個 dictionary 中儲存另一個 dictionary,這種擴充性可以讓 dictionary 更容易地應對複雜的資料結構和需求。 #### 節省記憶體: Dictionary 可以避免使用大量的變數或 list 等容器來儲存資料,這可以節省記憶體的使用,提升程式效能。特別是在處理大量資料時,dictionary 可以大幅降低程式的記憶體需求。 在下面的程式中,我們創建了一個 dictionary scores,並儲存了學生的名字和分數。接著,我們使用 for 迴圈來遍歷 scores 中的所有分數,計算學生的總分,最後再除以學生的總數來得到平均分數。 這個程式使用 dictionary 來儲存學生的資料,這樣可以避免創建多個變數或 list 來儲存學生的名字和分數。這樣可以大幅節省記憶體的使用,特別是在處理大量資料時,使用 dictionary 可以顯著提升程式的效能。 > 範例 ```python=1 # 創建一個字典來儲存學生的名字和分數 scores = {'John': 90, 'Mary': 85, 'Tom': 92, 'Jane': 88} # 計算學生的總分和平均分數 total = 0 for score in scores.values(): total += score average = total / len(scores) # 輸出平均分數 print("Average score: ", average) ``` > 輸出 ```python=1 88.75 ``` ### 3.使用方法 #### 3.1 宣告 ```python=1 #方法1 dictionary名稱 = { key1: value1 , key2: value2} #方法2 dictionary [key] = value #此做法也可以用來修改dictionary中的元素 ``` #### 3.2 取得元素 一維取值 ```python=1 dictionary[key] ``` 二維取值 ```python=1 #key1是最外層dictionary的key值,key2是內層dictionary的key值=1 Dictionary[key1][key2] #key1是最外層dictionary的key值,內層dictionary可以用index值來取得value Dictionary[key1][index] ``` #### 3.3 函式(以下dict作為一個dictionary名稱) > del dict[key]:刪除dictionary裡的key和對應的value ```python=1 dict1 = {1: "apple", 2: "banana", 3: "cherry"} del dict1[2] print(dict1) ``` > 輸出 ```python=1 {1: "apple", 3: "cherry"} ``` > del(dict):刪除整個dictionary ```python=1 dict2 = {1: "apple", 2: "banana", 3: "cherry"} del dict2 print(dict2) ``` > 輸出 ```python=1 # 結果不存在,回傳 NameError: name 'dict2' is not defined ``` > clear():清空整個dictionary ```python=1 dict3 = {1: "apple", 2: "banana", 3: "cherry"} dict3.clear() print(dict3) ``` > 輸出 ```python=1 {} ``` > get():get(key) 在dictionary內搜尋key所對應的value。若找不到該key,則回傳None ```python=1 dict4 = {1: "apple", 2: "banana", 3: "cherry"} print(dict4.get(2)) print(dict4.get(4)) ``` > 輸出 ```python=1 "banana" None ``` > len():取得元素個數 ```python=1 dict5 = {1: "apple", 2: "banana", 3: "cherry"} print(len(dict5)) ``` > 輸出 ```python=1 3 ``` > key():取得所有key ```python=1 dict6 = {1: "apple", 2: "banana", 3: "cherry"} print(dict6.keys()) ``` > 輸出 ```python=1 dict_keys([1, 2, 3]) ``` > values():取得所有value ```python=1 dict7 = {1: "apple", 2: "banana", 3: "cherry"} print(dict7.values()) ``` > 輸出 ```python=1 dict_values(["apple", "banana", "cherry"]) ``` > items():取得所有元素,包含key和value ```python=1 dict8 = {1: "apple", 2: "banana", 3: "cherry"} print(dict8.items()) ``` > 輸出 ```python=1 dict_items([(1, "apple"), (2, "banana"), (3, "cherry")]) ``` ### 4.應用 #### 4.1 存儲鍵值對 dictionary 是一種鍵值對存儲結構,它可以用來存儲一個物件或數據的相關信息。例如,可以使用 dictionary 存儲一個人的基本信息,例如姓名、年齡、性別等。 > 範例 ```python =1 # 存儲一個人的基本信息 person = {'name': 'John', 'age': 30, 'gender': 'Male'} print(person['name']) print(person['age']) print(person['gender']) ``` > 輸出 ```python =1 'John' 30 'Male' ``` #### 4.2 頻率統計 dictionary 可以用於對數據中的頻率進行統計。例如,可以使用 dictionary 統計一個字符串中每個字符出現的頻率,或統計一個列表中每個元素出現的次數。 > 範例 ```python=1 # 統計一個字符串中每個字符出現的頻率 s = 'hello world' freq = {} for char in s: freq[char] = freq.get(char, 0) + 1 print(freq) ``` > 輸出 ```python=1 {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1} ``` #### 4.3 計數器 dictionary 可以用作計數器,以計算一個事件發生的次數。例如,可以使用 dictionary 計算一個網站的訪問次數,或計算一個商品的銷量。 > 範例 ```python=1 # 計算一個網站的訪問次數 visits = {} def visit_page(url): visits[url] = visits.get(url, 0) + 1 visit_page('https://www.google.com') visit_page('https://www.facebook.com') visit_page('https://www.google.com') print(visits) ``` > 範例 ```python=1 {'https://www.google.com': 2, 'https://www.facebook.com': 1} ``` #### 4.4 配置文件(補充) dictionary 可以用作配置文件,以存儲程序的配置信息。例如,可以使用 dictionary 存儲一個網站的設置信息,例如網站名稱、網站 URL、網站樣式等。 > 範例 ```python=1 # 存儲一個網站的設置信息 config = { 'site_name': 'My Website', 'site_url': 'https://www.example.com', 'theme': 'light', 'font_size': 16 } print(config['site_name']) print(config['theme']) ``` > 輸出 ```python=1 'My Website' 'light' ``` #### 4.5 模板替換(補充) dictionary 可以用於模板替換,以替換模板中的變量。例如,可以使用 dictionary 將一個包含變量的字符串模板替換為具體的數據。 > 範例 ```python=1 # 使用 dictionary 將一個包含變量的字符串模板替換為具體的數據 template = 'Welcome {name} to {site}!' data = {'name': 'John', 'site': 'My Website'} message = template.format(**data) print(message) ``` > 輸出 ```python=1 'Welcome John to My Website!' ``` ## 五、 Set 集合 ### 1. 特色 set不包含重複元素且沒有順序性,就像多拉ㄟ夢的百寶袋一樣,若宣告重複元素到set中,set會自動刪除,相同元素只保留一個 **沒有順序,無法使用index取值。若要利用index取值,則要先將set轉換成list** > 範例 ```python=1 # 創建一個set my_set = {1, 2, 3, 4, 5} # 將set轉換為list my_list = list(my_set) # 印出轉換後的list print(my_list) ``` > 輸出 ```python=1 [1, 2, 3, 4, 5] ``` ### 2. 優點 #### 沒有重複元素: 當在一個Set中添加重複元素時,只會保留一個元素,其它的都會被自動刪除,這樣可以避免重複元素對後續操作造成的干擾。 當我們需要去除列表中的重複元素時,可以使用Set來實現,只需要把列表轉換成Set,再轉換回列表即可。 > 範例 ```python=1 # 創建一個包含重複元素的列表 my_list = [1, 2, 3, 3, 4, 4, 5] # 將列表轉換為set my_set = set(my_list) # 印出set中的所有元素 print(my_set) ``` > 輸出 ```python=1 (1, 2, 3, 4, 5) ``` #### 集合運算: Set支持許多集合運算,例如聯集、交集、差集等等。這些集合運算可以方便地實現多個集合之間的比較和操作。 * 聯集:兩個集合出現過的所有元素 ![](https://i.imgur.com/0wK5p48.png) (圖片來源:維基百科) * 交集:兩個集合都有的元素 ![](https://i.imgur.com/hHsfjlV.png) (圖片來源:維基百科) * 差集:某集合擁有,但另一個集合沒有的元素。 ![](https://i.imgur.com/IfBijOm.jpg) (圖片來源:https://www.newton.com.tw/wiki/補集) #### 支持多種元素類型: Set中可以存儲任意類型的元素,例如數字、字符串、元組等等,而且不同類型的元素可以混合存儲在同一個Set中。 > 範例 ```python=1 my_set = set() # 建立一個空的set # 增加元素到set my_set.add("apple") my_set.add(3) my_set.add(3.14) my_set.add(True) print(my_set) ``` > 輸出 ```python=1 {True, 3.14, 3, 'apple'} ``` ### 3. 使用方法 #### 3.1宣告 ```python=1 #宣告空集合 set名稱 = set() #注意不能用「set名稱={}」來宣告空集合,不然路被判定為空dictionary #宣告有元素的集合 set名稱 = { 元素1 , 元素2 , … } ``` #### 3.2函式 > add():新增元素 ```python=1 # 建立一個空的Set my_set = set() # 使用add()新增元素 my_set.add(1) my_set.add('apple') my_set.add(True) # 顯示Set中的元素 print(my_set) ``` > 輸出 ```python=1 {1, 'apple', True} ``` > remove():刪除元素 ```python=1 # 建立一個Set my_set = {1, 2, 3, 'apple', 'banana'} # 使用remove()刪除元素 my_set.remove(2) my_set.remove('banana') # 顯示Set中的元素 print(my_set) ``` > 輸出 ```python=1 {1, 3, 'apple'} ``` > len():回傳元素個數 ```python=1 # 建立一個Set my_set = {1, 2, 3, 'apple', 'banana'} # 使用len()回傳元素個數 print(len(my_set)) ``` > 輸出 ```python=1 5 ``` > min():回傳最小值。前提是set內所有元素皆為數字型態 ```python=1 # 建立一個Set my_set = {10, 5, 20, 15, 30} # 使用min()回傳最小值 print(min(my_set)) ``` > 輸出 ```python=1 5 ``` > max():回傳最大值。前提是set內所有元素皆為數字型態 ```python=1 # 建立一個Set my_set = {10, 5, 20, 15, 30} # 使用max()回傳最大值 print(max(my_set)) ``` > 輸出 ```python=1 30 ``` > sum():回傳總和。前提是set內所有元素皆為數字型態 ```python=1 # 建立一個Set my_set = {10, 5, 20, 15, 30} # 使用sum()回傳總和 print(sum(my_set)) ``` > 輸出 ```python=1 80 ``` > union():回傳聯集 ```python=1 # 定義集合 A 和集合 B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} # 集合聯集 union_set = A.union(B) print(union_set) # 使用運算子也可以達到相同的效果 union_set2 = A | B print(union_set2) ``` > 輸出 ```python=1 {1, 2, 3, 4, 5, 6, 7, 8} {1, 2, 3, 4, 5, 6, 7, 8} ``` > intersection():回傳交集 ```python=1 # 定義集合 A 和集合 B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} # 集合交集 intersection_set = A.intersection(B) print(intersection_set) # 使用運算子也可以達到相同的效果 intersection_set2 = A & B print(intersection_set2) ``` > 輸出 ```python=1 {4, 5} {4, 5} ``` > difference():回傳差集 ```python=1 # 定義集合 A 和集合 B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} # 集合差集 difference_set = A.difference(B) print(difference_set) # 使用運算子也可以達到相同的效果 difference_set2 = A - B print(difference_set2) ``` > 輸出 ```python=1 {1, 2, 3} {1, 2, 3} ``` ### 4. 應用 #### 4.1 重複元素刪除 使用set可以輕鬆地從列表中刪除重複的元素。例如: ```python=1 my_list = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4] my_set = set(my_list) unique_list = list(my_set) print(unique_list) # 輸出結果:[1, 2, 3, 4] ``` #### 4.2 成員測試 使用set可以很容易地檢查一個元素是否在集合中。例如: ```python=1 my_set = set([1, 2, 3, 4, 5]) if 3 in my_set: print("3在集合中") else: print("3不在集合中") ``` #### 4.3 數學運算 set支援數學運算,例如聯集、交集、差集等。例如: ```python=1 set1 = set([1, 2, 3, 4, 5]) set2 = set([3, 4, 5, 6, 7]) union_set = set1 | set2 # 聯集 intersect_set = set1 & set2 # 交集 diff_set = set1 - set2 # 差集 print(union_set) # 輸出結果:{1, 2, 3, 4, 5, 6, 7} print(intersect_set) # 輸出結果:{3, 4, 5} print(diff_set) # 輸出結果:{1, 2} ``` #### 4.4 字符串處理 使用set可以快速地判斷一個字符串是否包含重複的字符。例如: ```python=1 word = "hello" if len(set(word)) == len(word): print("沒有重複的字符") else: print("有重複的字符") ``` # 練習題 ## 是非題 > 1. 宣告list時,必須使用方括號將元素包含起來。 正確答案: 是。 解析:在Python中,宣告list時必須使用方括號,例如:[1, 2, 3]。 > 2. 一個list中可以同時包含不同資料類型的元素。 正確答案: 是。 解析:list可以包含不同資料類型的元素,例如:[1, "hello", True]。 > 3. 修改list中的元素是合法的操作。 正確答案: 是。 解析:list是可變的資料類型,可以通過索引修改其中的元素。 > 4. 在list中,元素的索引從1開始。 正確答案: 否。 解析:list和tuple一樣,元素的索引從0開始。 > 5. list的元素可以被刪除。 正確答案: 是。 解析:list是可變的資料類型,可以使用del關鍵字刪除其中的元素。 > 6. 使用方括號宣告list時,必須使用逗號將元素分開。 正確答案: 是。 解析:在宣告list時,必須使用逗號將元素分開,即使只有一個元素也要加上逗號,例如:[1, ]。 > 7. 宣告list時,必須使用圓括號將元素包含起來。 正確答案: 否。 解析:在Python中,宣告list時必須使用方括號,而不是圓括號。 > 8. 如果忘記宣告list,Python會拋出NameError。 正確答案: 否。 解析:如果忘記宣告list,Python會拋出SyntaxError。 > 1. 一個tuple中可以同時包含不同資料類型的元素 正確答案: 是。 解析:tuple可以包含不同資料類型的元素,例如:(1, "hello", True)。 > 2. 宣告tuple時,必須使用方括號將元素包含起來。 正確答案: 否。 解析:在Python中,宣告tuple時必須使用圓括號,而不是方括號。 > 3.修改tuple中的元素是合法的操作。 正確答案: 否。 解析:tuple是不可變的資料類型,一旦創建了tuple,就無法修改其中的元素。 > 4. 在tuple中,元素的索引從0開始。 正確答案: 是。 解析:tuple和list一樣,元素的索引從0開始。 > 5. 使用tuple時,必須使用逗號將元素分開。 正確答案: 是。 解析:在宣告tuple時,必須使用逗號將元素分開,即使只有一個元素也要加上逗號,例如:t = (1, )。 > 6. tuple的元素可以被刪除。 正確答案: 否。 解析:tuple是不可變的資料類型,一旦創建了tuple,就無法刪除其中的元素。 > 7. 使用tuple時,可以使用list的方法。像是append()等函式。 正確答案: 否。 解析:tuple和list是不同的資料類型,它們有自己的方法。 > 1. set中的元素可以重複。 正確答案:否 解析:set中的元素不會重複,每個元素在set中只會出現一次。 > 2. set支持下標索引。 正確答案:否 解析:set是無序的集合,不支持下標索引。 > 3. 可以使用len()函數來獲取set中元素的數量。 正確答案:是 解析:可以使用len()函數來獲取set中元素的數量。 > 4. set支持添加元素的操作。 正確答案:是 解析:可以使用add()方法向set中添加元素。 > 5. set支持刪除元素的操作。 正確答案:是 解析:可以使用remove()方法刪除set中的元素。 > 6. set支持按值排序。 正確答案:否 解析:set是無序的集合,不支持按值排序。 > 7. 可以使用in關鍵字來判斷元素是否在set中。 正確答案:是 解析:可以使用in關鍵字來判斷元素是否在set中。 > 8. set支持嵌套。 正確答案:否 解析:set中只能包含不可變的元素,不能嵌套其他集合類型。 > 9. set可以進行數學運算,如聯集、交集、差集等。 正確答案:是 解析:set可以進行數學運算,例如可以使用|運算符實現聯集,&運算符實現交集,-運算符實現差集等。 ## 選擇題 > 下列哪一個符號可以用來建立一個 dictionary? > A. [] > B. () > C. {} > D. // 答案:C 解析:大括號 {} 可以用來建立一個 dictionary,括號內包含 key 和 value,以冒號 : 隔開每一對 key 和 value。 > 下列哪一個函式可以用來判斷一個 key 是否在一個 dictionary 中? > A. in() > B. append() > C. pop() > D. insert() 答案:A 解析:使用 in() 函式可以判斷一個 key 是否在一個 dictionary 中。 > 下列哪一個方法可以用來獲取一個 dictionary 中所有的 keys? > A. keys() > B. values() > C. items() > D. append() 答案:A 解析:使用 keys() 方法可以獲取一個 dictionary 中所有的 keys。 > 下列哪一個方法可以用來獲取一個 dictionary 中所有的 values? > A. keys() > B. values() > C. items() > D. append() 答案:B 解析:使用 values() 方法可以獲取一個 dictionary 中所有的 values。 > 下列哪一個方法可以用來獲取一個 dictionary 中所有的 key-value 配對? > A. keys() > B. values() > C. items() > D. append() 答案:C 解析:使用 items() 方法可以獲取一個 dictionary 中所有的 key-value 配對。 > 下列哪一個方法可以用來刪除一個 dictionary 中指定的 key-value 配對? > A. delete() > B. remove() > C. pop() > D. discard() 答案:C 解析:使用 pop() 方法可以刪除一個 dictionary 中指定的 key-value 配對。 > 下列哪一個方法可以用來清空一個 dictionary? > A. clear() > B. empty() > C. delete() > D. remove() 答案:A 解析:使用 clear() 方法可以清空一個 dictionary。 > 下列哪一個符號可以用來修改一個 dictionary 中已有的 value? > A. [] > B. () > C. {} > D. // 答案:A 解析:使用中括號 [] 可以修改一個 dictionary 中已有的 value,只需要指定要修改的 key 即可。 > 下列哪一個方法可以用來複製一個 dictionary? > A. copy() > B. clone() > C. duplicate() > D. replicate() 答案:A 解析:使用 copy() 方法可以複製一個 dictionary。 > 下列哪一個方法可以用來新增一個 key-value 配對到一個 dictionary 中? > A. push() > B. add() > C. insert() > D. update() 答案:D 解析:使用 update() 方法可以新增一個 key-value 配對到一個 dictionary 中。如果 key 已經存在 ## 實作題 > 問題 寫一個Python程式,將兩個整數列表 list1 和 list2 合併成一個新的列表 merged_list,並將 merged_list 中的所有元素按照從小到大的順序排列。 使用者可以輸入兩行數字測資,然後進行此功能。 ``` 提示:可以使用for迴圈去遍歷容器內的所有元素,進行比較等功能。 以下是for迴圈的語法: for var in sequence: statements 以下是一個簡單的 for 迴圈的範例: numbers = [1, 2, 3, 4, 5] for n in numbers: print(n) 在這個例子中,我們定義了一個列表 numbers,並使用 for 迴圈遍歷其中的元素。在每次迭代中,我們從列表中取出一個元素,並將其賦值給變數 n,然後打印出 n 的值。這樣,我們就可以依次打印出列表中的所有元素。 ``` > 範例測資 5 3 8 2 6 1 > 範例輸出 ``` [1, 2, 3, 5, 6, 8] ``` > 參考解答 ```python =1 # 使用者輸入兩行數字測資,每行以空格分隔數字,並將其轉換為整數列表 list1 = [int(x) for x in input().split()] list2 = [int(x) for x in input().split()] # 將兩個列表合併 merged_list = [] for x in list1: merged_list.append(x) for x in list2: merged_list.append(x) # 對合併後的列表進行排序 for i in range(len(merged_list)): for j in range(i+1, len(merged_list)): if merged_list[i] > merged_list[j]: merged_list[i], merged_list[j] = merged_list[j], merged_list[i] # 輸出結果 print(merged_list) ``` > 解析 這個程式碼中,我們使用了兩個 for 迴圈,將 list1 和 list2 兩個列表合併成一個新的列表 merged_list。然後,我們使用兩個嵌套的 for 迴圈來對 merged_list 列表中的元素進行排序。在排序過程中,我們使用了兩個索引 i 和 j,來遍歷所有的元素,並比較它們的大小,如果發現前一個元素比後一個元素大,就交換它們的位置。 最後,我們輸出排序後的列表 merged_list,即得到了最終的結果。