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