Try   HackMD

!!! 從第四課的留言開始

https://www.youtube.com/watch?v=JLU5oc4_VtA&list=PL-g0fdC5RMboYEyt6QS2iLb_1m7QcgfHk&index=4&ab_channel=彭彭的課程

影片大綱

  1. List 可更動的有序列表。
  2. Tuple 不可更動的有序列表。
  3. 列表的索引操作,連續資料操作。
  4. 列表的刪除、更改。
  5. 列表的長度。
  6. 使用巢狀列表。

影片

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →


筆記

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)

↓下面這個留言可以學一下。

老師你好 對於影片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])

↓下面這個留言可以學一下。

不好意思,想請問一下老師
如果是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("存在")

↓下面這個留言可以學一下。

請問如果想呼叫以下每個列表的第一個數字
為什麼寫成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])

↓下面這個留言可以學一下。

謝謝老師 但是我有點問題 就是既然List和Tuple只在能不能更動資料上有差異,那Tuple有什麼存在的必要呢?全部都用List打不是最方便嗎?

---
Tuple的特性是immutable(不變性),有些場合我們不希望資料Build出來後會再被變動,例如多線程的部份,或者物件的狀態比較等等,這時候就適合使用具有不變性的資料集。

---
既然tuple不可變動,而list可以,為什麼不只用list?

---
只用 list 是可以的哦。只是介紹一下有其他東西,不能動的東西通常運算效率會好一些 :)

↓下面這個留言可以學一下。

老師,請問若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)

↓下面這個留言可以學一下。

data[ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ]

請問如何將[ 1 , 2 , 3 ]消除?
(print(data)終端機跑出[ [ 4 , 5 , 6 ] ])

---
最直接的做法就:
del data[0]

↓下面這個留言可以學一下。

請問彭彭老師,使用副檔名為.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 檔案名稱

↓下面這個留言可以學一下。

例題內容:
請輸入喜歡的水果(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

↓下面這個留言可以學一下。

彭彭老師,請問一下  
我在練習刪除時,使用空格取代,但原來列表雖被成功取代,但同時也留下 [ ] 的符號,在列表內
請問這是哪個步驟出錯了呢?

---
我的影片中是刪除一整段,若要刪除單一元素,可以這樣處理:
list[0:1]=[] # 刪除編號 0 的元素

或是可以用 del
del list[0] # 刪除編號 0 的元素

↓下面這個留言可以學一下。

請教一下
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]就不一樣

這種取代 要怎麼界定什麼時候要括號什麼時候不用呢? 謝謝

↓下面這個留言可以學一下。

請問老師有辦法教學中指的不可變動  是指不能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)

↓下面這個留言可以學一下。

彭彭老師想請教你 影片16:08 data[0]=5更改資料的部分為甚麼不是用()而是用[] 這裡不是在說明tuple?

---
建立 Tuple 是用 () 沒錯。
不過建立之後要去取得列表中的資料,還是得用:列表[編號],這樣的方式來處理嘍。

↓下面這個留言可以學一下。

請教彭彭老師:
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,是動態的資料結構,可以輕鬆的新增、修改、刪除資料,只要基本語法有符合,大致上也沒甚麼特別的限制嘍 :)

↓下面這個留言可以學一下。

如何將input中的數據轉化成list
例子:
將 nums=input(2,3,4,5,7)
改成[2,3,4,5,7]
謝謝

---
字串可以使用 split 這個方法,例如:
nums=input("numbers:")
list=nums.split(",")

END