iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0

前言

在 Python 裡,除了數字 (int/float)、文字 (str)、布林 (bool) 這些基本型態之外,還有一類超級重要的資料型態 —— 集合型態 (Collection Types)

它們就像遊戲裡的「背包系統」,專門用來裝東西、整理東西。

Python 常見的四大集合型態是:

  1. List 串列:有序、可變,超級常用(今天的主角)
  2. Tuple 元組:有序、不可變,適合固定資料
  3. Dict 字典:鍵值配對,超好查資料
  4. Set 集合:無序、不重複,數學集合好幫手

昨天我們學了 if/else,讓程式會「思考」。但現實中,我們常常要處理的不是一個值,而是一整堆資料:

  • 檢查購物清單裡有沒有牛奶
  • 查看待辦事項裡今天要不要運動
  • 點速食店的餐點

這時候,就需要能「一次裝很多東西」的工具 —— List 串列

今天,我們就先從 List 開始!

一、什麼是 List?

List(串列)就是一個用來裝資料的「容器」,
它的格式是用 中括號 [ ] 包起來,裡面的元素用 逗號 , 分隔。

list_name = [元素1, 元素2, 元素3, ...]

特點:

  • 有序:資料有位置編號(索引 index),能依序存取
  • 可變 (mutable):可以新增、刪除、修改
  • 可混合型別:裡面可以同時放數字、字串、布林值,甚至還能放其他串列!

二、建立 List 的方法

# 空串列
empty_list = []

# 裡面都是字串
fruits = ["apple", "banana", "cherry"]

# 可以混合型別
mixed = [1, "hello", 3.14, True]

# 串列裡面還能放串列(巢狀結構)
nested = [[1, 2], [3, 4], [5, 6]]

三、透過索引存取元素

每個元素都有「位置編號」(Index),從 0 開始(非常重要!常被忽略)。

fruits = ["apple", "banana", "cherry"]

print(fruits[0])   # apple
print(fruits[1])   # banana
print(fruits[2])   # cherry
print(fruits[-1])  # cherry(倒數第一個)

⚠️ 小提醒:如果你嘗試存取不存在的索引,Python 會直接報錯!

例如:
https://ithelp.ithome.com.tw/upload/images/20250923/201647211RjGdkaVbo.png

這邊我們來詳細的解釋一下「索引」的概念!

索引就是「位置編號」,用來在『有序」的資料結構
(例如 listtuplestrrange 等序列)中定位某個元素。
透過索引,你可以「讀取」、「修改」(若序列可變)、或「刪除」特定位置的元素。

(1)Python 採用「0 起始」的索引(Zero-based)

在 Python 裡,序列的第一個元素索引是 0,第二個是 1,以此類推。

fruits = ["apple", "banana", "cherry"]
print(fruits[0])  # "apple"
print(fruits[1])  # "banana"
print(fruits[2])  # "cherry"

(2) 負索引(Negative indices)— 從尾端開始數

Python 支援負數索引:
-1 表示最後一個元素,-2 表示倒數第二個,以此類推。

fruits = ["apple", "banana", "cherry"]
print(fruits[-1])  # "cherry"
print(fruits[-2])  # "banana"

(3)索引越界(IndexError)—— 要小心邊界

若試圖存取 seq[index]
index 不在合法範圍(-len(seq)len(seq)-1)時,
會拋出 IndexError

(就像是剛剛上面舉例的fruits list)

a = [1,2,3]
# print(a[3])  # IndexError: list index out of range

(4)切片(Slicing):一次取一段(非單一索引)

切片使用 seq[start:stop:step]
會回傳子序列(新的 list 或 str)。stop 是「不包含」的

nums = [0,1,2,3,4,5]
print(nums[1:4])    # [1,2,3]   (包含 index=1,2,3,不包含4)
print(nums[:3])     # [0,1,2]
print(nums[3:])     # [3,4,5]
print(nums[::2])    # [0,2,4]   (step=2)
print(nums[::-1])   # [5,4,3,2,1,0]  (反轉序列)

‼️可變 vs 不可變的索引行為

  • list可變(mutable),可用索引直接修改元素:lst[1] = new_value
  • tuple / str不可變(immutable),不能用索引賦值(會拋 TypeError)。(這部分我們之後會再說明)

我們先來看一下list如何修改元素:

fruits = ["apple", "banana", "cherry"]

# 修改第二個元素
fruits[1] = "blueberry"
print(fruits)  # ["apple", "blueberry", "cherry"]

你看!只要用索引,就能直接把值改掉喔!
這也是 List 在處理動態資料時特別好用的原因。

四、List新增與刪除

fruits = ["apple", "banana", "cherry"]

# 新增元素
fruits.append("mango")   # 加到最後
fruits.insert(1, "orange")  # 插到指定位置

# 刪除元素
fruits.remove("banana")  # 移除指定值
fruits.pop()             # 移除最後一個

這邊要再補充一個刪除的語法:del
del 不是函式:語法是 del target(不能寫成 del(list[0]))。

(1)刪除指定索引的元素

fruits = ["apple", "banana", "cherry", "mango"]
del fruits[1]        # 刪掉 index=1 的元素 "banana"
print(fruits)        # ['apple', 'cherry', 'mango']

(2)刪除最後一個元素(del vs pop())

fruits = ["apple", "banana", "cherry"]
del fruits[-1]       # 刪掉最後一個
print(fruits)        # ['apple', 'banana']

# 如果你還需要那個被刪掉的值,用 pop() 更合適
fruits = ["apple", "banana", "cherry"]
last = fruits.pop()  # 回傳 'cherry'
print(last, fruits)  # cherry ['apple', 'banana']

(3)刪除部分範圍(切片)

numbers = [0,1,2,3,4,5,6]
del numbers[2:5]     # 刪掉 index=2,3,4
print(numbers)       # [0,1,5,6]

(4)刪除整個List變數(解除名稱綁定)

lst = [1,2,3]
del lst              # 變數 lst 不再存在,訪問會 NameError
# print(lst)  # NameError: name 'lst' is not defined

注意:del lst 並非「刪掉記憶體中那個 list」,而是移除名稱 lst 的綁定;
如果其他變數也參考同一個 list(例如 b = lst),
該物件仍存在直到沒有引用為止,由 Python 的垃圾回收處理。

五、常見操作:排序/取極值(最大小值)

numbers = [5, 2, 9, 1, 7]

print(len(numbers))   # 5 → 串列長度
print(max(numbers))   # 9 → 最大值
print(min(numbers))   # 1 → 最小值
print(sum(numbers))   # 24 → 總和

numbers.sort()        # 排序(小到大)
print(numbers)        # [1, 2, 5, 7, 9]

numbers.reverse()     # 反轉順序
print(numbers)        # [9, 7, 5, 2, 1]

範例:待辦清單

todo_list = []

todo_list.append("寫 Python 作業")
todo_list.append("去運動")
todo_list.append("追劇")

print("目前待辦清單:", todo_list)

done = todo_list.pop(0)   # 完成第一項
print("已完成:", done)
print("剩下待辦清單:", todo_list)

輸出結果:
https://ithelp.ithome.com.tw/upload/images/20250923/20164721Qbp1qKAH7C.png

delpop()remove()clear() 的差別

  • del list[index]:依 索引 刪除,沒有回傳值;可刪切片或整個變數。 適合你知道索引且不需要該值時使用。
  • pop([index]):依索引刪除並 回傳被刪除的元素(預設為最後一個),常用在需要取得該值的情況。
  • remove(value):依 刪除第一個相符元素
    (找不到會拋 ValueError)。
  • clear():清空 List 內容,List 物件仍存在但變成 []
    (等同 del lst[:])。
  • del lst:刪除變數名稱(變數不存在),若沒有其他引用,物件會被回收。

懶人包看這邊!

  • 想刪掉並拿值 → pop()
  • 已知值要刪 → remove()
  • 已知索引要刪 → del
  • 要整個清空內容 → clear()del lst[:]
  • 要刪變數名稱 → del lst

範例:我的購物清單

shopping_list = ["milk", "bread", "eggs", "butter"]

# 1. 新增 cheese
shopping_list.append("cheese")

# 2. 刪掉 bread
shopping_list.remove("bread")

# 3. milk 改成 almond milk
shopping_list[0] = "almond milk"

# 4. 印出結果
print("清單長度:", len(shopping_list))
print("清單內容:", shopping_list)

if/else + List = 更實用!

實戰演練:打造「互動式清單」

到這裡,我們已經可以用 if 條件判斷,讓程式根據使用者輸入做出不同的回應。那我們把它跟 list(清單)input() 結合,來試試幾個實用小挑戰吧!

練習 1:購物清單(新增物品)

menu = ["burger", "fries", "nuggets", "coke", "salad"]
order_list = []

item = input("請輸入想要點的餐點: ")

if item in menu:
    order_list.append(item)
    print("✅ 已新增到點餐清單:", order_list)
else:
    print("❌ 抱歉,這個品項不在速食店菜單上。")

https://ithelp.ithome.com.tw/upload/images/20250923/20164721oa8zuaxYVZ.png

練習2:簡易登入/註冊系統

# 先建立兩個對應的清單
users = ["amy", "bob", "cindy"]
passwords = ["123", "456", "789"]  # 和 users 的帳號一一對應

# 使用者輸入帳號與密碼
name = input("請輸入帳號: ")
pwd = input("請輸入密碼: ")

if name in users:  # 如果帳號存在
    index = users.index(name)  # 找到帳號的位置
    if passwords[index] == pwd:  # 驗證密碼
        print("登入成功!歡迎回來~")
    else:
        print("密碼錯誤,登入失敗!")
else:
    print("找不到帳號,請註冊新帳號!")
    new_pwd = input("請設定新密碼: ")
    users.append(name)
    passwords.append(new_pwd)
    print(f"帳號 {name} 已成功註冊!")
    print("目前使用者名單:", users)

https://ithelp.ithome.com.tw/upload/images/20250923/20164721UVsW6CJJ3x.png

⭐️重點解析:(這邊來解釋一下我用的語法!)

  1. 兩個清單(list)對應
    • users 裡存帳號
    • passwords 裡存密碼(跟帳號的 index 對應)
  2. 帳號存在 → 檢查密碼
    • 先用 .index() 找到帳號位置
    • 再用對應的 passwords[index] 檢查密碼
  3. 帳號不存在 → 註冊
    • 新增帳號和密碼到對應的清單

📌小提醒

這樣的寫法雖然能動,但要維護兩個 List 比較麻煩,還要確保索引位置完全對得上。當我們學到**dict(字典)**之後,就能寫成:

{"amy": "123", "bob": "456"}

這樣程式看起來也比較直觀、乾淨!

練習3:刪除清單中的物品

shopping_list = ["milk", "bread", "eggs"]

remove_item = input("請輸入想刪除的物品: ")

if remove_item in shopping_list:
    shopping_list.remove(remove_item)
    print(f"已刪除 {remove_item},目前清單:", shopping_list)
else:
    print("找不到這個物品,無法刪除。")

https://ithelp.ithome.com.tw/upload/images/20250923/20164721vBfCUqbvIJ.png

新手建議

  1. 多動手試:看懂語法很重要,但真正學會一定要自己打幾次。或是也可以先把邏輯寫下來,用pseudo code的方式把邏輯順過一遍!
  2. 善用 print():不確定程式在幹嘛?印出來看!就知道了!
  3. 遇到錯誤不要怕IndexErrorValueError 都很常見,先讀懂錯誤訊息再修正。
  4. 從生活情境下手:把清單想成「背包」、「購物車」、「待辦事項」,會更有感。越困難的部分要用越簡單的想法去想~

結語

今天我們正式進入了 Python 的「集合型態」大門,先從 list 串列 開始認識。

相信你應該掌握了以下重點:

  1. list 的格式:用 [] 建立,裡面可以放不同型別的資料。
  2. 可變性(mutable):list 裡的資料能修改、刪除、新增。
  3. 索引(index):用正數從前面數、負數從後面數,就像幫每個元素編號。
  4. 常見操作append()remove()len()del…等方法,讓清單真正成為「資料倉庫」。
  5. 練習應用:購物清單等

學到這裡,你的程式已經不只是單純「做計算」,而是能夠存放一堆東西,再進行有條理的處理。這就是程式邁向「資料處理」的第一步。

明日預告

辛苦啦!看到這邊的你又撐過一天了~

如果說 list 是「裝東西的櫃子」,那麼明天要介紹的 range() 就是「幫你自動排好數字的流水線」。

  • 你會看到如何快速生成一串數字,不需要傻傻地手動打一個個數字。
  • 我們會介紹 range(start, stop, step) 的三種參數玩法,讓數字生成變得超彈性。
  • 最後,還會搭配 list() 與迴圈,做一些有趣的小應用。

準備好,明天我們要讓數字「自動列隊」,讓程式更有效率地處理資料!
那麼,我們就明天見囉!!


上一篇
【Day8】 程式的分岔路口—條件判斷:if / elif / else
下一篇
【Day10】 數字序列小幫手: range( )
系列文
Python 小白的逆襲:30 天從零到能教人的精華筆記,寫給迷惘的你與當年的我自己!10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言