# 資研 12/15 社課講義
[**提問表單**](https://forms.gle/z4dPC1JPV6uA2q9w7)
---
## 列表 List
:::warning
**資料型態**
| Text | Numeric | boolean |
|:----:|:-------:|:------:|
| `string` | `int`、`float` | `bool` |
- 容器
| Sequence | Mapping | Set |
|:--------:|:-------:|:----:|
| `list`、`tuple` | `dict` | `set` |
:::
### 宣告列表
- 列表表示方法:`[]`
- 宣告:
```python=
L = ['apple', 'bananas']
L = list(('apple', 'bananas'))
```
- 若 `[]` 內不放任何元素,即創建**空列表**
- 列表內可放置**多個元素**
- 利用 `list()` 將其他資料型態轉為列表
- 列表內之元素**不限於單一資料型態**
>數字、字串、布林值皆可置於列表內
```python=
# 多個元素
L1 = ['apple', 'bananas']
print(L1, type(L1))
# 輸出:['apple', 'bananas'] <class 'list'>
# 將其他東西轉成列表
T = ('apple', 'bananas')
print(type(T))
L1_ = list(T)
print(L1_, type(L1_))
# 輸出:<class 'tuple'>
# ['apple', 'bananas'] <class 'list'>
# 不限單一資料型態
L2 = ['a', 1, True]
print(L2)
# 輸出:['a', 1, True]
# 空列表
L3 = []
print(L3)
# 輸出:[]
```
### 讀取資料
- 利用`index`來限制取的範圍
- 使用`[a:b]`;a為開頭的index,b為<font color="#CE0000">**結尾前**</font>的index
>"-1"表示倒數,從-1開始
>不包含b
```python=
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
print(L)
# 輸出:['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
# 單一index
print(L[0])
# 輸出:'Monday'
# 單一index(倒數)
print(L[-1])
# 輸出:'Sunday'
# 一段(沒b)
print(L[2:])
# 輸出:['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
# 一段(沒a)
print(L[:4])
# 輸出:['Monday', 'Tuesday', 'Wednesday', 'Thursday']
# 一段
print(L[2:4])
# 輸出:['Wednesday', 'Thursday']
```
### 判斷是否存在
- 使用`in`
```python=
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
if 'Monday' in L: print(True)
else: print(False)
# 輸出:True
print('July' in L)
# 輸出:False
```
### 迭代
- 列表和字串一樣屬於**可迭代物件**
```python=
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
for i in L: print(i, end=' ,')
# 輸出:Monday ,Tuesday ,Wednesday ,Thursday ,Friday ,
```
### 函式
| 函式用法 | 用途 |
|:-------------------------:|:--------------------------------------------------------------:|
| `List.insert(n, element)` | 在 n 的位置插入 element |
| `List.append(element)` | 在 List 的**尾端**插入 element |
| `List_a.extend(List_b)` | 將 List_b 所有元素併入 List_a |
| `List.remove(element)` | 刪去**首次出現**的 element |
| `List.pop(n)` | 刪去位於 n 的元素並返回刪去的值 |
| `del List[n]` | 刪去於位於 n 的元素 |
| `List.clear()` | 刪去 List 內所有元素 |
| `List.sort()` | 將 List 內的元素依 ASCII 碼**小到大**排序(可使用reverse參數) |
| `sorted()` | 將 List 內的元素依 ASCII 碼**小到大**排序 |
| `List.reverse()` | 將 List 內的元素順序反轉 |
| `List.copy()` | 回傳 List 的複製品 |
| `List.index(element)` | 回傳 List 內第一次出現 element 的位置 |
| `List.count(element)` | 回傳 List 內 element 的出現次數 |
| `sum(List)` | 當 List 全為數字時回傳 List 內數字總和 |
>其中List表**列表名稱**,n表**index**,element表**元素**
```python=
# insert
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
L.insert(0, '1')
print(L)
# 輸出:['1', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
# append
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
L.append('Saturday')
print(L)
# 輸出:['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
# extend
L1 = ['Monday', 'Tuesday', 'Wednesday']
L2 = ['Thursday', 'Friday']
L1.extend(L2)
print(L1)
# 輸出:['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
# remove
L = ['Monday', 'Thursday', 'Wednesday', 'Thursday', 'Friday']
L.remove('Thursday')
print(L)
# 輸出:['Monday', 'Wednesday', 'Thursday', 'Friday']
# pop
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
L.pop(1)
print(L)
# 輸出:['Monday', 'Wednesday', 'Thursday', 'Friday']
# del
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
del L[0]
print(L)
# 輸出:['Tuesday', 'Wednesday', 'Thursday', 'Friday']
# clear
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
L.clear()
print(L)
# 輸出:[]
# sort
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
L.sort()
print(L)
# 輸出:['Friday', 'Monday', 'Thursday', 'Tuesday', 'Wednesday']
# sorted
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
L_ = sorted(L)
print(L_)
# 輸出:['Friday', 'Monday', 'Thursday', 'Tuesday', 'Wednesday']
# reverse
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
L.reverse()
print(L)
# 輸出:['Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday']
# copy
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
L_ = L.copy()
print(L_)
# 輸出:['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
# index
L = ['Monday', 'Thursday', 'Wednesday', 'Thursday', 'Friday']
i = L.index('Thursday')
print(i)
# 輸出:1
# count
L = ['Monday', 'Thursday', 'Wednesday', 'Thursday', 'Friday']
i = L.count('Thursday')
print(i)
# 輸出:2
# sum
L = [10, 11, 12, 13, 14]
print(sum(L))
# 輸出:60
```
:::warning
### **比較**
1. append & extend
- 差別:append為**加入**一個元素;extend為**併入**一個完整列表
```python=
# 用 for loop + append 達到和 extend 一樣的效果
L1 = ['Monday', 'Tuesday', 'Wednesday']
L2 = ['Thursday', 'Friday']
for i in L2: L1.append(i)
print(L1)
#輸出:['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
# extend
L1 = ['Monday', 'Tuesday', 'Wednesday']
L2 = ['Thursday', 'Friday']
L1.extend(L2)
print(L1)
# 輸出:['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
```
[參考網站](https://www.freecodecamp.org/news/python-list-append-vs-python-list-extend/)
2. extend & '+'
- 差別:在電腦運算上,有些微速度上差異,除非大量運算,否則差別僅存在於使用extend時L1的值有所改變
>若使用 '+=' 則完全相同
```python=
# extend
L1 = ['Monday', 'Tuesday', 'Wednesday']
L2 = ['Thursday', 'Friday']
L1.extend(L2)
print(L1)
# 輸出:['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
# +
L1 = ['Monday', 'Tuesday', 'Wednesday']
L2 = ['Thursday', 'Friday']
print(L1+L2)
# 輸出:['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
```
[參考網站](https://stackoverflow.com/questions/3653298/concatenating-two-lists-difference-between-and-extend)
3. remove & pop & del
- 差別:remove以**元素**去比較並刪去第一個**相同元素**;pop以**index**去比較並<font color="#CE0000">**返回刪去的值**</font>;del以**index**去比較
```python=
# pop返回值
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(L.pop(1), L)
# 輸出:Tuesday ['Monday', 'Wednesday', 'Thursday', 'Friday']
# remove
L = ['Monday', 'Thursday', 'Wednesday', 'Thursday', 'Friday']
L.remove('Thursday')
print(L)
# 輸出:['Monday', 'Wednesday', 'Thursday', 'Friday']
# del
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
del L[0]
print(L)
# 輸出:['Tuesday', 'Wednesday', 'Thursday', 'Friday']
```
[參考網站](https://www.geeksforgeeks.org/what-is-difference-between-del-remove-and-pop-on-python-lists/)
4. sort & sorted
- 差別:sort為直接改變原來的列表,且**可使用reverse參數**;sorted則是回傳排序後的列表
```python=
# sort
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
L.sort()
print(L)
# 輸出:['Friday', 'Monday', 'Thursday', 'Tuesday', 'Wednesday']
# sorted(不另外賦值)
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(sorted(L))
# 輸出:['Friday', 'Monday', 'Thursday', 'Tuesday', 'Wednesday']
```
5. sort完再reverse & sort(reverse=True)
- 當被排序的列表內,單一元素有2個值時,兩者產生差別
```python=
# sort(reverse=True)
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
L.sort(reverse=True)
print(L)
# 輸出:['Wednesday', 'Tuesday', 'Thursday', 'Monday', 'Friday']
```
[參考網站](https://gist.github.com/yangshun/ffaf68380ef71c157c3b)
6. copy & '=' & list()
- 差別:除list()還有轉換期他資料型態成列表外,沒有太大差異
```python=
# copy(不另外賦值)
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(L.copy())
# 輸出:['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
# '='
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
L_ = L
print(L_)
# 輸出:['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
# list(複製)
L = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
L_ = list(L)
print(L_)
# 輸出:['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
# list(轉換)
L = 'M o n d a y'
L_ = list(L.split())
print(type(L), type(L_), '\n', L_)
# 輸出:<class 'str'> <class 'list'>
# ['M', 'o', 'n', 'd', 'a', 'y']
```
:::
## **練習題**
**Zerojudge**
[**連結**](https://zerojudge.tw/)
---
## 補充資料
**推薦網站:**[**W3Schools**](https://www.w3schools.com/)