# 陣列 #### 114/10/31 #### 講師:昱山 --- ## 多變數輸入 ---- ### 在 `input()` 後加上 `.split()` ```python a, b = input().split() ``` ---- 意義: `.split()` 括號內代表資料如何分隔。 預設為空一格 ---- ### 範例一 程式碼: ```python= a, b = input().split() print(a, "喜歡吃", b, sep = "") ``` 輸入: ```bash 小明 蘋果 ``` 輸出: ```bash 小明喜歡吃蘋果 ``` ---- ### 範例二 (改用頓號分隔) 程式碼: ```python= a, b = input().split("、") print(a, "喜歡吃", b, sep = "") ``` 輸入: ```bash 小明、蘋果 ``` 輸出: ```bash 小明喜歡吃蘋果 ``` ---- `input().split()` 預設為字串**串列**(**list** of strings),不能直接用 `int()` 轉換,需要改用 `map()` ---- ### 範例: 程式碼: ```python a, b, c = map(int, input().split()) #a, b, c為整數 print(a + b + c) #輸出總和 ``` 輸入: --- ## 陣列 #### (`array`) ---- 每個陣列可以儲存很多資料 目的是減少需要設太多變數 ---- ### 四種陣列種類 <table class="table table-bordered bg-white text-center border-c" style="color: #333333; border: 1px solid #58595a;" data-darkreader-inline-color="" data-darkreader-inline-border-top="" data-darkreader-inline-border-right="" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left=""> <tr> <td>中文</td> <td>英文</td> <td>範例</td> </tr> <tr> <td>串列</td> <td>List</td> <td>[1, 2, 3]</td> </tr> <tr> <td>元組</td> <td>Tuple</td> <td>(1, 2, 3)</td> </tr> <tr> <td>集合</td> <td>Set</td> <td>{1, 2, 3}</td> </tr> <tr> <td>字典</td> <td>Dictionary</td> <td>{"1" : "小明", "2" : "小美" }</td> </tr> </table> <br> [這張表好像在哪看過?](https://hackmd.io/@CRC-YUSHAN/B1c4-HH2gx#/2/4) ---- 課程會先著重在 `list` 其它類型之後再說 --- ## 串列 #### (`list`) ---- ### 簡介: * `list` 裡可以放不同種類的資料型態 * 資料由 `0` 開始 ---- ### 建立方式 創建 `list` 的方法有很多種 ---- ### 方法一 直接在程式打出來 ``` list1 = [1, 2, 3, "昱山", 5] print(list1) ``` 輸出: ```bash [1, 2, 3, "昱山", 5] ``` ---- ### 方法二 從輸入打出來 ```python list2 = list(map(int, input().split())) print(list2) ``` 輸入: ```bash 1 2 3 4 5 ``` 輸出: ```bash [1, 2, 3, 4, 5] ``` ---- ### 方法三 用 `range()` 生成 ```python list3 = list(range(2, 10, 2)) print(list3) ``` 輸出: ```bash [2, 4, 6, 8] ``` ---- 一次性將多個資料做成`list` ,會用到 `list()` 函式 --- ## `.append()` 與 `.pop()` ---- 在一個list中增加、減少資料 * list.append(要增加的資料) 會增加在list最右邊 * 刪減 list.pop(位置) 會刪除該位置的資料 ---- 範例: ```python= list4 = [1, 2, 3, "hello", 9.9] print(list4) list4.append("wow") #加上 "wow" print(list4) list4.pop(3) #移除第 3 個( 1 為第 0 個) print(list4) ``` 輸出: ```bash [1, 2, 3, 'hello', 9.9] [1, 2, 3, 'hello', 9.9, 'wow'] [1, 2, 3, 9.9, 'wow'] ``` --- ## 處理個別元素 ---- ### `list[索引值]` ```python list5 = [1, 2, 3, "昱山", 5] print(list5[0]) #輸出 1 (第 0 個元素) print(list5[1]) #輸出 2 (第 1 個元素) print(list5[-1]) #輸出 5 (最後 1 個元素) ``` ---- 為什麼索引值從 `0` 開始? <img src="https://storage.googleapis.com/lds-media/images/python-arrays.width-1200.jpg"> 圖片來源:[ `IndexError: list index out of range and python` ](https://www.learndatasci.com/solutions/python-indexerror-list-index-out-range-and-python/) ---- A:因為第一個元素在記憶體位置,索引值相當於偏移量,紀錄到記憶體位置的距離。 <img style="width: 80%; height: 80%;" src="https://log2base2.com/images/c/array-indexing.png "> 圖片來源:[ Array index always starts from 0](https://log2base2.com/c-questions/array/why-array-index-start-with-0.html) --- ## 切片 #### (`slicing`) ---- 明明只改變 `b` ,為什麼連 `a` 也跟著改了? * 程式: ```python a = [1, 2, 3] b = a b[0] = 999 #改變 b 的第 0 項 print(a) print(b) ``` * 輸出: ```bash [999, 2, 3] [999, 2, 3] ``` ---- A: 因為 `b = a` 不只是複製 `a` 的元素,更是複製 `a` 的記憶體位置。 `b[0] = 999` 會在該記憶體位置根據偏移量改變元素 ---- 正確寫法:`b = a[:]` ```python a = [1, 2, 3] b = a[:] # ←-- 這才是正確寫法 b[0] = 999 print(a) print(b) ``` ---- ### 切片的基本語法 ```python list[start:end:step] ``` | 參數 | 意義 | 說明 | | ------- | --------- | ---------------- | | `start` | 起始索引(包含) | 從哪個位置開始(預設為 `0`) | | `end` | 結束索引(不包含) | 到哪個位置結束(預設為列表長度) | | `step` | 步長 | 每次跳幾個元素(預設為 `1`) | 跟 `range()` 很像 ---- ### 範例一 ```py= a = [10, 20, 30, 40, 50] b = a[1:4] print(b) # 輸出:[20, 30, 40] ``` ---- ### 範例二 省略起點或終點 ```py= a = [10, 20, 30, 40, 50] print(a[:3]) # [10, 20, 30] → 從頭取到索引 2 print(a[2:]) # [30, 40, 50] → 從索引 2 取到結尾 print(a[:]) # [10, 20, 30, 40, 50] → 整個列表的淺拷貝 ``` ---- ### ★ 範例三 反轉列表 ```python= a = [1, 2, 3, 4, 5] b = a[::-1] print(b) # [5, 4, 3, 2, 1] ``` (這很重要,大家要記起來) ---- ### 範例四 每隔幾個取一個 ```python a = [0, 1, 2, 3, 4, 5, 6, 7, 8] print(a[::2]) # [0, 2, 4, 6, 8] print(a[1::3]) # [1, 4, 7] ``` 說明:第三個值 `step` 控制間隔。 ---- ### 範例五 負索引 ```python a = [10, 20, 30, 40, 50] print(a[-3:]) # [30, 40, 50] print(a[:-2]) # [10, 20, 30] ``` 說明:`-n` 表示最後 `n` 個元素。 ---- ### 範例六 修改部分列表 ```python a = [1, 2, 3, 4, 5] a[1:4] = [9, 9, 9] print(a) # [1, 9, 9, 9, 5] ``` 說明:切片也可以**直接替換**那一段的內容。 ---- ### 小結 | 語法 | 功能 | | -------------- | --------------- | | `a[start:end]` | 取部分元素 | | `a[:end]` | 從頭取到某位置 | | `a[start:]` | 從某位置取到結尾 | | `a[:]` | **複製整個列表(淺拷貝)** | | `a[::step]` | 每隔幾個取一個 | | `a[::-1]` | **反轉列表** | ---- [等等這用法好像在哪裡看過?](https://hackmd.io/@CRC-YUSHAN/BySlh2r5ge#/5/7) ---- `str` 也適用切片的用法, 但無法藉由 `s[0] = "H"` 更改 ``` s = "hello" l = [1, 2, 3] s[0] = "H" # ❌ 錯誤:'str' object does not support item assignment l[0] = 9 # ✅ 可行 print(l) # [9, 2, 3] ``` --- 若串列裡還有串列, 可以再加一組中括號讀取內層串列裡的元素 如: ```py # 建立一個包含內層串列的串列 a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 讀取內層串列裡的元素 print(a[0][1]) # 讀取第一個內層串列的第二個元素 -> 2 print(a[2][0]) # 讀取第三個內層串列的第一個元素 -> 7 ``` --- ## 歡樂 ~~`zerojudge`~~ 時間 ## `kahoot` --- ## THE END.
{"title":"陣列","description":"試教","slideOptions":"{\"theme\":\"sky\",\"transition\":\"convex\"}","contributors":"[{\"id\":\"b831f9fa-52bb-4a09-bfbb-148e4fdadd0f\",\"add\":5936,\"del\":211,\"latestUpdatedAt\":1761902338727}]","lang":"zh-TW"}
    210 views