---
# System prepended metadata

title: 資料結構-1
tags: [電算社講義, 電算社講義-python]

---

# 資料結構-1

---

# 什麼是資料結構?

----

資料結構是可以儲存值的容器
我們最常用的有list、set、dict、tuple。
要注意True和1是一樣的，False和0也是。
這對某些操作有影響

---

# list串列
[講義](https://hackmd.io/@ts-boring/S1fIOlOxke#/4)

----

list就是之前講的陣列。
能以a=[x,y,...]宣告。
list內可以存種類型的東西，
也可以存資料結構

----

## 操作
增加、刪除
```python
a = [1, 2, 3, 4]
a.append(5) # [1, 2, 3, 4, 5] # 在最後加上5
a.insert(10, 2) # [1, 2, 10, 3, 4, 5] # 插入10使得a[2]=10
del a[1] # [1, 10, 3, 4, 5] # 由位置移除值，也可用陣列分割移除大塊
a.remove(4) # [1, 10, 3, 5] # 由值移除第一個遇到的值
b = a.pop(2) # b=3, a=[1, 10, 5] # 由位置取得並刪除值
```

----

## 操作
陣列連結
```python
a = ['a1', 'a2', 'a3']
b = ['b1', 'b2']
c = a+b #c先加入a，後面再接b
# c = ['a1', 'a2', 'a3', 'b1', 'b2']
a.extend(c) #在a後面接c
# a = ['a1', 'a2', 'a3', 'a1', 'a2', 'a3', 'b1', 'b2']
```

----

## 操作
迴圈陣列、陣列分割
```python
a = [x for x in range(1,5)]
# a = [1, 2, 3, 4]
b = a[1:2]
# b = [2, 3]
c = a[1::-1]
# c = [2, 1]
```

----

## 操作
字串分裂
```python
str = 'ab.  .. c'
a = str.split('.') # 以'.'分開字串
# a = ['ab', '  ', '', ' c', '']
b = str.split() # 沒寫就是以空格分開，不過這時連著的空格中間不分開
# b = ['ab.', '..', 'c'] 
c = list(str)
# c = ['a', 'b', '.', ' ', ' ', '.', '.', ' ', 'c'] 每個都分開
```

---

# set集合

----

## 性質
類似list，但是是用大括號{}包起來
但set內部的元素不會重複
且順序對於set並不重要

----

## 操作
### 宣告、增加、刪減
```python
a = {1, True, 2, 3} # {1, 2, 3}
a.add(4) # {1, 2, 3, 4}
a.remove(1) # {2, 3, 4}
a.discad(3) # {2, 4}
b1 = [1, 2, 3, False]
b = set(b1) # {1, 2, 3, False}
```
要注意，如果remove不存在的東西會出錯，
但discard則不會。

----

## 操作
### 集合互動
```python
a = {1, 2, 3}
b = {1, 4}
# 交集(a和b兩個都要有)
c = a & b # {1}
c = a.intersection(b) # 同功能，看得懂就好，建議寫上面的
# 聯集(a或b至少一個有)
c = a | b # {1, 2, 3, 4}
c = a.union(b)
# 差集(a有b沒有)
c = a - b # {2, 3}
c = a.difference(b)
# 對稱差集(a有b沒有 或 b有a沒有)
c = a ^ b # {2, 3, 4}
c = a.symmetric_difference(b)
```

----

## 子集合、超集合
如果a有的元素b都有，則a是b的子集合
b是a的超集合。
a是b的真子集合、b是a的真超集合代表
b包含了不只a，還有其他東西

----

## 操作
集合比較
| 運算 | 意義         | 同義運算    |
|:---- |:------------ | --- |
| a>=b | a是b的超集   | a.issuperset(b) |
| a>b  | a是b的真超集 |
| a<=b | a是b的子集   | a.issubset(b) |
| a<b  | a是b的真子集 |

---

# tuple元組

----

## 性質
tuple類似list，都可以一個個存取
tuple裡的元素不能修改，只能存取或直接覆蓋tuple

----

## 操作
### 宣告
可以由小括號()包起來，或是用tuple()宣告
如果是空的，只能用tuple()宣告
如果只有一個元素，要用()的話後面要接,，不然tuple會被拆掉
```python
a = (1, 2, 3) # a=(1, 2, 3)
b = tuple() # b=()
c = (10,) # c=(10,)
d = (2) # d=2
```

----

## 操作
### tuple拆解
如果有一個長度n的tuple，可以用n個變數去拆解他
```python
a = (1, 5, 2)
x, y, z = a # x=1, y=5, z=2
b, c = (10, 1) # b=10, c=1
```

----

## tuple和set、list的互動
可以用tuple來宣告list和set
裡面也可以用小括號包起來的tuple
```python
a = (1, 3, 2, 3)
b = list(a) # [1, 3, 2, 3]
c = set(a) # {1, 3, 2}
d = list((1, a)) # [1, (1, 3, 2, 3)]
```

---

# dict字典

----

## 性質
字典類似list，但是是以不重複的字串為
索引(鍵值key)，而不是連續的數字。
和set一樣，也是以大括號包起來。

----

## 操作
宣告
```python
a = {} # 空字典(因此不能這樣宣告空集合)
b = {'a' : 10, 'b' : [1, 2]} # {'a' : 10, 'b' : [1, 2]}
c = dict(a = 4, c = 'app') # {'a' : 4, 'c' : 'app'}
d1 = [['a', 2], ['1', 3]]
d = dict(d1) # {'a' : 2, '1' : 3}
```

----

## 讀取、新增、修改
```python
a = {'a':3}
print(a['a']) # 輸出:3
a['hi'] = 'no' # {'a' : 3, 'hi' : 'no'}
a['a'] = 2 # {'a' : 2, 'hi' : 'no'}
print(a.get('hi')) # 輸出:'no'，如果[]內的不存在會出錯，但get不會
print(a.setdefault('why', 1)) # 輸出:1
    # a={'a' : 2, 'hi' : 'no', 'why' : 1},類似get，但若不存在會補上
```

----

## dict轉換成set
可以用set()來把dict變成set，
只會保留鍵值
```python
a = {'a' : 10, 'b' : [1, 2]}
b = set(a) # b = {'a', 'b'}
```

---

# 通用操作

----

## 長度
len()可用來取得裡面有多少元素
對list、set、tuple、dict都可以用
```python
a = [1, 2, 3]
b = {2, 3}
c = (3, 4, 5, 6)
print(len(a)) # 3
print(len(b)) # 2
print(len(c)) # 4
```

----

## 包含
對list、set、tuple都可以用
dict會先自動變成set後再判斷
in 可檢查一物是否在此資料結構內
```python
a = [1, 2, 3]
b = {2, 3, 4}
c = (3, 4, 5)
print(2 in a) # 輸出:True
print(2 in b) # 輸出:True
print(2 in c) # 輸出:False
print(True in a) # 輸出:True
```

----

## 刪除
del可以刪除某個值
對list、dict可以用
```
a = {'a' : 1, 'b' : 3}
del a['a'] # a = {'b' : 3} 
```

----

## 存取並刪除
.pop()可以存取某個值，並且將其刪除
對list、dict可以用

```
a = {'a' : 1, 'b' : 3}
x = a.pop('a') # a = {'b' : 3}, x=1
b = [1, 2, 3, 4]
y = b.pop() # a = [1, 2, 3], y=4 (只有list可以空)
```

----

## 清除
.clear()可以把整個清空
對list、set、dict可以用

---

# 注意
True和1是一樣的，False和0也是
這對於set、in等會有影響