---
# System prepended metadata

title: 資研 12/15 社課講義
tags: [社課講義, 資研]

---

# 資研 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/)