--- title: ch04. Python 有序列表的基本運算 - List、Tuple By 彭彭 tags: 彭彭, 學習, 筆記 --- !!! 從第四課的留言開始 https://www.youtube.com/watch?v=JLU5oc4_VtA&list=PL-g0fdC5RMboYEyt6QS2iLb_1m7QcgfHk&index=4&ab_channel=%E5%BD%AD%E5%BD%AD%E7%9A%84%E8%AA%B2%E7%A8%8B # 影片大綱 1. List 可更動的有序列表。 2. Tuple 不可更動的有序列表。 3. 列表的索引操作,連續資料操作。 4. 列表的刪除、更改。 5. 列表的長度。 6. 使用巢狀列表。 # 影片 {%youtube JLU5oc4_VtA %} --- # 筆記 ## List - 索引基本運用: 取得資料,更新資料列表 - 連續資料處理: 串接、取代、連續刪除列表中的資料 - 取得列表的長度(就是有多少資料): len(列表) - 巢狀列表: 列表中的資料也是列表。 ## Tuple - 和 List 原則上一樣,之前教的操作原則上都相同。 - 資料不可更動: 操作與 List 相同,但資料不可更動。 -- ## 補充 可以利用 append 把資料一一放進去,大概像下面這樣的概念再配合迴圈運作: - list=[] - list.append(3) - list.append(4) 可以從 List 中間插入數值。 如果是多個數值可能會失敗 - list=[10,13,14,15,16] - list.insert(1, 11) - print(list) List 和 Tuple 都可以是巢狀結構 - data=[[1,2],[3,4,5]] - data=((1,2),(3,4,5)) List 裡面不一定要放型態一樣的東西 - data=[(3,4,5),[6,6,6]] - type(data[0]) - type(data[1]) 巢狀列表的英文是 NESTED LIST。 list模組下的函式 - count。a.count(b): b在a這個list中出現的次數。 - index。a.index(b): b在a這個list中,第一次出現的index位置。 - insert。a.insert(要插入的index位置, 數值) 刪除單一元素的方法 - del list[0] - list[0:1] -- ## YT留言 ``` # 有序可變動列表 List grades=[12,60,25,70,90] print(grades) print(grades[0]) print(grades[3]) print(grades[1:4]) grades=[12,60,25,70,90] grades[0]=55 # 把 55 放到列表中的第一個位置 print(grades) grades=[12,60,25,70,90] grades[1:4]=[] # 連續刪除列表中從編號 1 到編號 4(不包括) 的資料 print(grades) grades=[12,60,25,70,90] grades=grades+[12,33] print(grades) grades=[12,60,25,70,90] # 取得列表的長度 len(列表資料) length=len(grades) print(length) data=[[3,4,5],[6,7,8]] print(data[0]) print(data[0][1]) print(data[0][0:2]) print(data) data[0][0:2]=[5,5,5] print(data) # 有序不可變動列表 Tuple data=(3,4,5) # data[0]=5 # 錯誤︰Tuple的資料不可以變動 print(data[2]) print(data[0:2]) ``` ``` 老師我想問怎麼依序輸入列表,像C語言寫法是 for(int i=0;i<N;i++) scanf("%d",&ary[i]); 那PyTHON 要怎麼寫 --- 利用 append 把資料一一放進去,大概像下面這樣的概念再配合迴圈運作: list=[] list.append(3) list.append(4) ``` ``` 請問老師[10,13,14,15,16]要插入數字可以嗎? 可以從中間插入或是第一個就插入嗎? 比方說 插入 11變成[10,11,12,13.....] or [9,10,13,14...] --- list=[10,13,14,15,16] list.insert(1, 11) print(list) ``` :::info ↓下面這個留言可以學一下。 ::: ``` 老師你好 對於影片5:44處 還有一些疑問 現在grades = [12, 60, 15, 70, 90] 然後我想要一次印出 [12, 60, 90] i.e print (grades[0, 1, 4]) 但是 如國執行 print (grades[0, 1, 4]) 會有錯誤 TypeError: list indices must be integers or slices, not tuple 請問該如何修正 同樣 如果相同資料 grades = [12, 60, 15, 70, 90] 我只想印出大於或等於 60的資料 我期待是 [60, 70, 90] 我的想法 print(grades > 60) 但是同樣無法執行 請問該如何修正 不知道以上問題該如何解決 還請老師回答 謝謝 --- 第一個問題你可以先分別取出在串起來,如下: grades=[12, 60, 15, 70, 90] print(grades[0:2]+grades[4:5]) 第二個問題我們可以寫一個迴圈去做搜尋,並且把結果存放到另一個列表中再展示出來,例如: grades=[12, 60, 15, 70, 90] betterGrades=[] for data in grades: if data>=60: betterGrades.append(data) print(betterGrades) --- 也可以之後用 pandas 的模組解決。 import pandas as pd grades=[12, 60, 15, 70, 90] data=pd.Series(grades) condition=data>=60 print(data[condition]) ``` :::info ↓下面這個留言可以學一下。 ::: ``` 不好意思,想請問一下老師 如果是a=[(1,2,3),(4,5,6)] 巢狀的要如何判斷3是不是在a裡面呢? 3 in a[0] =>這種寫法是可行,但是這是我已經知道了(1,2,3)是在list第0個位置 假設今天資料是很長一串list,我想找某個元素是否有在裡面的話,大概要如何做呢? 感謝 --- 結合迴圈,去逐一抓取列表中的每一個子項目,然後再判斷是否在其中,例如: for s in a: if 3 in s: print("存在") ``` :::info ↓下面這個留言可以學一下。 ::: ``` 請問如果想呼叫以下每個列表的第一個數字 為什麼寫成print(y[0:3][1])後答案是[6, 7, 8]而不是[1,6,9]。 y=[[1,2,3],[6,7,8],[9,10,11]] #巢狀列表 不好意思我是新手發問,有許多不懂,希望老師能幫我解答,謝謝。 --- y 裡頭中的三個元素是三個子列表。 y[0:3] 代表 y 中的第一到第三個元素,也就是裡面的三個子列表。 然後 y[0:3][1] 代表三個子列表中的第二個,也就是你看到的 [6, 7, 8] --- 如果要顯示每個的第一個,可以使用迴圈 for x in [0,1,2]: print(y[x][0]) 或是 for x in range(3): print(y[x][0]) ``` :::info ↓下面這個留言可以學一下。 ::: ``` 謝謝老師 但是我有點問題 就是既然List和Tuple只在能不能更動資料上有差異,那Tuple有什麼存在的必要呢?全部都用List打不是最方便嗎? --- Tuple的特性是immutable(不變性),有些場合我們不希望資料Build出來後會再被變動,例如多線程的部份,或者物件的狀態比較等等,這時候就適合使用具有不變性的資料集。 --- 既然tuple不可變動,而list可以,為什麼不只用list? --- 只用 list 是可以的哦。只是介紹一下有其他東西,不能動的東西通常運算效率會好一些 :) ``` :::info ↓下面這個留言可以學一下。 ::: ``` 老師,請問若data=[3,4,5],[6,7,8] 我想把4改成[9,9] 輸入data[0][1]=[9,9] 會出現[3,[9,9],5] 請問該如何打才不會多出現一對中括號 --- 單一項好像容易出狀況。但若以 12:40 例子來看,用不同長度的資料取代原有範圍可行 我想到的方法是 data=[ [3,4,5], [6,7,8] ] data [0][0:2] = [3,9,9] print (data) ``` :::info ↓下面這個留言可以學一下。 ::: ``` data[ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ] 請問如何將[ 1 , 2 , 3 ]消除? (print(data)終端機跑出[ [ 4 , 5 , 6 ] ]) --- 最直接的做法就: del data[0] ``` :::info ↓下面這個留言可以學一下。 ::: ``` 請問彭彭老師,使用副檔名為.py 或.IPYNB有何不同呢? 因為之前都是用jupyternoterbook在練習,最近才轉換使用編譯器進行練習。 但其實不太清楚用jupyter 或visaul studio在撰寫python上有何差異? 在煩請老師解惑 --- jupyter 是特殊的運作環境,你在我的影片中學到的是一般性的 python 運作環境,一般性的環境未來會比較容易擴展到別的應用,例如網站伺服器等等。 當成是兩種東西來學就可以。 ``` ``` 彭彭老師,想請教一下。老師第一堂課講 「# 中文字 」是程式中的註解, 打中文字是沒問題的, 但是為什麼我運算時會出現SyntaxError: Non-ASCII character '\xe6' in file list-tuple.py ? 我查了網上寫在文件頭部添加# coding=utf-8就可以解決(試過可以),但是想知道是不是因為我沒設置好軟體本身導致的? 為什麼老師不用額外添加代碼就可以運算,謝謝 --- 這可能是 Python 版本的問題,Mac 電腦確定有安裝最新的 Python 3 版本,執行時使用:python3 檔案名稱 ``` :::info ↓下面這個留言可以學一下。 ::: ``` 例題內容: 請輸入喜歡的水果(Enter 結束):木瓜 木瓜 不在list清單中 請輸入喜歡的水果(Enter 結束):西瓜 西瓜 在list清單中的第5項 請輸入喜歡的水果(Enter 結束) a=["蘋果","草莓","芒果","芭樂","西瓜","芭樂"] while True: b=input("請輸入喜歡的水果(Enter 結束):") n=a.count(b) # b 在 a(list)中,出現的次數。 print(n) if n>0: p=a.index(b) # b 在 a(list)中,出現的第一個位置。 print(b,"在list清單中的第",p+1,"項") elif n==0: print(b,"不在list清單中") else: break ``` :::info ↓下面這個留言可以學一下。 ::: ``` 彭彭老師,請問一下 我在練習刪除時,使用空格取代,但原來列表雖被成功取代,但同時也留下 [ ] 的符號,在列表內 請問這是哪個步驟出錯了呢? --- 我的影片中是刪除一整段,若要刪除單一元素,可以這樣處理: list[0:1]=[] # 刪除編號 0 的元素 或是可以用 del del list[0] # 刪除編號 0 的元素 ``` :::info ↓下面這個留言可以學一下。 ::: ``` 請教一下 grades=[12,60,15,70,90] grades[0:2]=55,55,55 grades[0:2]=[55,55,55] print(grades) 我試過2、3行的寫法跑出來的結果都一樣是[55, 55, 55, 15, 70, 90],請問一下是否兩種寫法都是正確的呢,有什麼差異性嗎 data=[[3,4,5],[6,7,8]] data[0][0:2]=5,5,5 data[0][0:2]=[5,5,5] print(data) 二維的我也是一樣有試過跑出來的結果都一樣是[[5, 5, 5, 5], [6, 7, 8]],請問一下是否兩種寫法都是正確的呢,有什麼差異性嗎 --- 彭彭 55,55,55 或 5,5,5 都會直接被當成 tuple 處理,所以都是可以的。最後結果也確實不會有什麼差別。 --- 想再問一下老師,可是[]不就是list,為甚麼會被當成tuple 處理呢? 另外: grades=[12,54,90,78,44] grades[2]=30 跑出來的結果是[12,54,30,78,44] 如果是grades[2]=[30],跑出來的結果就會變成[12,54,[30],78,44] 為甚麼這個會有這個差別? 但是 grades=[12,60,15,70,90] grades[0:2]=55,55,55 和grades[0:2]=[55,55,55]跑出來的結果會沒差呢? --- data=[[3,4,5],[6,7,8]] data[1][0]=9,8 #data[1][0]=(9,8) 結果一樣, 如果[9,8]印出來就不一樣 print(data) [[3, 4, 5], [(9, 8), 7, 8]] 老師應該就是這個意思吧? --- grades=[12,54,90,78,44] grades[0:2]=30,33 #(30,33) 或[30,33] 三個結果印出來都一樣 print(grades) [30, 33, 90, 78, 44] 跟單純grades[0]=30 # 30改成(30) 結果一樣, 但30改成[30]就不一樣 這種取代 要怎麼界定什麼時候要括號什麼時候不用呢? 謝謝 ``` :::info ↓下面這個留言可以學一下。 ::: ``` 請問老師有辦法教學中指的不可變動 是指不能update的意思嗎? 那麼資料的 add和del也算進去嗎 因為剛剛測了 grades = (12,60,15,70,90) grades = grades + (1,2) print( grades ) 這個語法是可行的 另外 #可以解釋為甚麼不同的資料型態可以串接嗎? grades = [12,60,15,70,90] grades = grades + ([12,60]) print( grades ) gradesEng = (12,13,14) gradesEng = gradesEng + [(1,2)] #那麼這裡會出錯的問題是為何呢? --- 確實是不能 update,例如 grades[0]=3 就會錯誤。 你的程式其實是取得兩個 tuple 的資料,並產生一個新的 tuple,最後覆蓋變數 grades。 後面的第一段 ([12,60]) 其實被當成一個 List,括號是運算中的一個輔助。 括號的用途很多,有時候不一定被詮釋成 tuple,例如 3*(3+1) 這個括號就只是表明運算順序。 後面的第二段 基本就是不行,錯誤訊息也寫得很清楚:tuple 只能夠串接 tuple。 --- gradesEng = gradesEng + [(1,2)],這一行中的 [(1,2)],為什麽在python中會被認為是list? --- 外層是 [] 就被認為是 List,裡面包含一個項目 (1,2) ``` :::info ↓下面這個留言可以學一下。 ::: ``` 彭彭老師想請教你 影片16:08 data[0]=5更改資料的部分為甚麼不是用()而是用[] 這裡不是在說明tuple? --- 建立 Tuple 是用 () 沒錯。 不過建立之後要去取得列表中的資料,還是得用:列表[編號],這樣的方式來處理嘍。 ``` :::info ↓下面這個留言可以學一下。 ::: ``` 請教彭彭老師: data[0][0:2]=[5,5,5] 此定義比原來[0:2]編號多一個數值,print 結果data[0] 多一個數值變成4個,成為[5,5,5,5] ,此部分有何規範與限制嗎? --- 其實就像你看到的,把 [0:2] 這段範圍中原本的 2 個數值,用 [5,5,5] 取代,自然就多一個數值。 Python 的列表,尤其是 List,是動態的資料結構,可以輕鬆的新增、修改、刪除資料,只要基本語法有符合,大致上也沒甚麼特別的限制嘍 :) ``` :::info ↓下面這個留言可以學一下。 ::: ``` 如何將input中的數據轉化成list 例子: 將 nums=input(2,3,4,5,7) 改成[2,3,4,5,7] 謝謝 --- 字串可以使用 split 這個方法,例如: nums=input("numbers:") list=nums.split(",") ``` --- # END