---
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