## 03-2 Python資料結構
###### - Python 小社課 -
###### **Gino**
---
## Python內建資料結構
- list
- tuple
- **◆set◆**
- dict
---
## set - 集合
**Python內建資料結構 - 3**
---
### 數學上的集合
----

一堆元素形成的群組
記號:$S = \{1, 2, 3, 4, 5, 6, ...\}$
----

集合內的元素沒有順序性
它只是描述「這些元素被歸類為同一類」
----

- $a$ 屬於 集合$A$
- $a \in A$
----

- $A \subset B \iff \forall a \in A, a \in B$
- 此時稱$A$ **包含於** $B$,$A$就是$B$的小孩(**子集合**)
----

- $A$ 是 $B$ 的子集,$B$ 也是 $A$ 的子集
- 只有一種情況 $\rightarrow$ $A = B$
- $A = B \iff A \subset B \land B \subset A$
好ㄅ這其實有點廢話
----
### 集合運算
----

集合$A$
----

集合$B$
----

- 宇集
- 包含所有東西的集合
- 記號為$\mathbb{U}$
----

- 空集
- 什麼東西都沒有的集合
- 記號為$\emptyset$
----

$A$的補集($\lnot A$)
----

$A$和$B$的聯集($A \cup B$)
----

$A$和$B$的交集($A \cap B$)
----

差集 $A - B$
----

差集$B - A$
----

對稱差集($A \ \triangle \ B$)
---
### Python Set的特點
----
跟數學的set幾乎一樣
1. 沒有重複元素
2. set裡面可以有各種型態的資料
除了list, set, dict以外
---
### Set
- **- 建立 -**
- 修改
- 檢查&查詢
- 集合運算
- 遍歷
----
```python=
# 有初始資料的set
s = {1, 2, 3, 4}
s = set([1, 2, 3, 4])
# 空的set
s = set()
# for迴圈建立set
s = {i for i in range(1, 5)} # {1, 2, 3, 4}
```
----
備註
建立空的set不能用{}
```python
s = {}
print(type(s)) # <class 'dict'>
```
{}會被當成空的**字典**(等等會介紹)
----
frozenset:也是set,但是建立好就不能修改
(所以速度會比較快)
```python=
s = frozenset([1, 2, 3, 4])
```
---
### Set
- 建立
- **- 修改 -**
- 檢查&查詢
- 集合運算
- 遍歷
----
```python=
s = {}
s.add(2) # {2}
```
新增單一元素
----
```python=
s = {}
s.update([1, 2, 3]) # {1, 2, 3}
```
新增多個元素
----
```python=
s = {1, 2, 3}
s.remove(2) # {1, 3}
```
刪除某個元素
----
做刪除操作時
集合裡面沒有該元素的話程式就會出錯
最好先檢查有沒有該元素
```python=
s = {1, 2, 3}
if 2 in s:
s.remove(2)
```
----
```python=
s = {1, 2, 3}
s.clear()
```
清空整個集合
---
### Set
- 建立
- 修改
- **- 檢查&查詢 -**
- 集合運算
- 遍歷
----
```python=
if a in A:
...
```
檢查a是否屬於A
----
```python=
if A.issubset(B):
...
```
檢查A是否為B的子集(A是否**包含於**B)
- (if A is subset of B)
- (if A.issubset(B))
----
```python=
if B.issuperset(A):
...
```
檢查B是否為A的母集(B是否**包含**A)
- (if B is superset of A)
- (if B.issuperset(A))
----
```python=
if A == B:
...
```
檢查A是否等於B
---
### Set
- 建立
- 修改
- 檢查&查詢
- **- 集合運算 -**
- 遍歷
----
```python=
A | B # 聯集
A & B # 交集
A - B # 差集A - B
B - A # 差集B - A
A ^ B # 對稱差集
```
----
```python=
A = {1, 2, 3}
B = {1, 2, 4}
C = A | B
print(C) # {1, 2, 3, 4}
```
---
### Set
- 建立
- 修改
- 檢查&查詢
- 集合運算
- **- 遍歷 -**
----
```python=
s = {1, 2, 3, 4, 5, 6}
for i in s:
print(i)
```
for迴圈
每次取出的資料順序都不同
基本上遍歷set沒什麼用
除非想要生成隨機排列(?
---
## Python內建資料結構
- list
- tuple
- set
- **◆dict◆**
---
## dict - 字典
**Python內建資料結構 - 4**
---

dict:顧名思義,就是字典
可以像字典一樣
快速查詢某個「單字」對應到的「解釋」
----
單字:key
對應到想要查的解釋:value

----
## dict的性質
----
1. 不會有兩個相同的key存在
2. key 可以是各種型態的資料,除了list, set, dict以外
----
### dict
- **- 建立 -**
- 修改
- 檢查&查詢
- 遍歷
----
```python=
# 有初始資料的dict
menu = {"Apple": 20, "Banana": 10, "Cucumber": 25}
menu = dict(Apple=20, Banana=10, Cucumber=25)
# 空的dict
menu = {}
menu = dict()
# for迴圈建立dict
fruit = ["Apple", "Banana", "Cucumber"]
price = [20, 10, 25]
menu = {fruit[i]: price[i] for i in range(0, 3)}
```
----
### dict
- 建立
- **- 修改 -**
- 檢查&查詢
- 遍歷
----
```python=
menu["Apple"] = 30
```
直接修改key對應到的value
----
```python=
del menu["Banana"]
menu.pop("Banana")
```
刪除某個key
----
```python=
print(menu.pop("Banana")) # 10
```
pop操作還會回傳value
(刪除"Banana",回傳"Banana"對應的價格 $\rightarrow$ 10)
----
做刪除操作時
字典裡面沒有那個key的話程式就會出錯
最好先檢查有沒有那個key
```python=
if "Apple" in menu:
menu.pop("Apple")
```
---
### dict
- 建立
- 修改
- **- 檢查&查詢 -**
- 遍歷
----
```python=
print(menu["Cucumber"]) # 25
```
查詢:dict[key]
----
```python=
if "Apple" in menu:
...
if "Apple" in menu.keys():
...
```
查詢key有沒有在dict裡面
----
```python=
if 25 in menu.values():
...
```
查詢value有沒有在dict裡面
---
### dict
- 建立
- 修改
- 檢查&查詢
- **- 遍歷 -**
----
```python=
menu = {"Apple": 20, "Banana": 10, "Cucumber": 25}
for fruit in menu:
print(fruit, menu[fruit])
# "Apple" 20
# "Banana" 10
# "Cucumber" 25
```
for迴圈
取出來的資料有固定順序
----
```python=
# 遍歷所有key
for fruit in menu.keys():
...
for fruit in menu:
...
# 便利所有value
for price in menu.values():
...
```
----
```python=
for item in menu.items():
print(item)
# ("Apple", 20)
# ("Banana", 10)
# ("Cucumber", 25)
```
items()會把key, value綁在一起變成一個tuple
{"metaMigratedAt":"2023-06-15T16:43:25.564Z","metaMigratedFrom":"YAML","title":"03-2 Python資料結構","breaks":true,"slideOptions":"{\"transition\":\"fade\",\"spotlight\":{\"enabled\":false}}","contributors":"[{\"id\":\"ac1507e0-f05c-4708-bdd2-c56d13fb0dbb\",\"add\":14918,\"del\":9911}]"}