---
# System prepended metadata

title: 容器(container)

---

# 容器(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，即得到了最終的結果。
