在 Python 裡,除了數字 (int/float)、文字 (str)、布林 (bool) 這些基本型態之外,還有一類超級重要的資料型態 —— 集合型態 (Collection Types)。
它們就像遊戲裡的「背包系統」,專門用來裝東西、整理東西。
Python 常見的四大集合型態是:
- List 串列:有序、可變,超級常用(今天的主角)
- Tuple 元組:有序、不可變,適合固定資料
- Dict 字典:鍵值配對,超好查資料
- Set 集合:無序、不重複,數學集合好幫手
昨天我們學了
if/else
,讓程式會「思考」。但現實中,我們常常要處理的不是一個值,而是一整堆資料:
- 檢查購物清單裡有沒有牛奶
- 查看待辦事項裡今天要不要運動
- 點速食店的餐點
這時候,就需要能「一次裝很多東西」的工具 —— List 串列。
今天,我們就先從 List 開始!
List(串列)就是一個用來裝資料的「容器」,
它的格式是用 中括號 [ ] 包起來,裡面的元素用 逗號 , 分隔。
list_name = [元素1, 元素2, 元素3, ...]
特點:
# 空串列
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 會直接報錯!
例如:
這邊我們來詳細的解釋一下「索引」的概念!
索引就是「位置編號」,用來在『有序」的資料結構
(例如 list
、tuple
、str
、range
等序列)中定位某個元素。
透過索引,你可以「讀取」、「修改」(若序列可變)、或「刪除」特定位置的元素。
在 Python 裡,序列的第一個元素索引是 0
,第二個是 1
,以此類推。
fruits = ["apple", "banana", "cherry"]
print(fruits[0]) # "apple"
print(fruits[1]) # "banana"
print(fruits[2]) # "cherry"
Python 支援負數索引:-1
表示最後一個元素,-2
表示倒數第二個,以此類推。
fruits = ["apple", "banana", "cherry"]
print(fruits[-1]) # "cherry"
print(fruits[-2]) # "banana"
若試圖存取 seq[index]
,
但 index
不在合法範圍(-len(seq)
到 len(seq)-1
)時,
會拋出 IndexError
。
(就像是剛剛上面舉例的fruits list)
a = [1,2,3]
# print(a[3]) # IndexError: list index out of range
切片使用 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] (反轉序列)
list
:可變(mutable),可用索引直接修改元素:lst[1] = new_value
。tuple
/ str
:不可變(immutable),不能用索引賦值(會拋 TypeError
)。(這部分我們之後會再說明)我們先來看一下list如何修改元素:
fruits = ["apple", "banana", "cherry"]
# 修改第二個元素
fruits[1] = "blueberry"
print(fruits) # ["apple", "blueberry", "cherry"]
你看!只要用索引,就能直接把值改掉喔!
這也是 List 在處理動態資料時特別好用的原因。
fruits = ["apple", "banana", "cherry"]
# 新增元素
fruits.append("mango") # 加到最後
fruits.insert(1, "orange") # 插到指定位置
# 刪除元素
fruits.remove("banana") # 移除指定值
fruits.pop() # 移除最後一個
這邊要再補充一個刪除的語法:deldel
不是函式:語法是 del target
(不能寫成 del(list[0])
)。
fruits = ["apple", "banana", "cherry", "mango"]
del fruits[1] # 刪掉 index=1 的元素 "banana"
print(fruits) # ['apple', 'cherry', 'mango']
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']
numbers = [0,1,2,3,4,5,6]
del numbers[2:5] # 刪掉 index=2,3,4
print(numbers) # [0,1,5,6]
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)
輸出結果:
del
、pop()
、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
條件判斷,讓程式根據使用者輸入做出不同的回應。那我們把它跟 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("❌ 抱歉,這個品項不在速食店菜單上。")
練習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)
⭐️重點解析:(這邊來解釋一下我用的語法!)
users
裡存帳號passwords
裡存密碼(跟帳號的 index 對應).index()
找到帳號位置passwords[index]
檢查密碼📌小提醒
這樣的寫法雖然能動,但要維護兩個 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("找不到這個物品,無法刪除。")
IndexError
、ValueError
都很常見,先讀懂錯誤訊息再修正。今天我們正式進入了 Python 的「集合型態」大門,先從 list 串列 開始認識。
相信你應該掌握了以下重點:
[]
建立,裡面可以放不同型別的資料。append()
、remove()
、len()
、del
…等方法,讓清單真正成為「資料倉庫」。學到這裡,你的程式已經不只是單純「做計算」,而是能夠存放一堆東西,再進行有條理的處理。這就是程式邁向「資料處理」的第一步。
辛苦啦!看到這邊的你又撐過一天了~
如果說 list 是「裝東西的櫃子」,那麼明天要介紹的 range()
就是「幫你自動排好數字的流水線」。
range(start, stop, step)
的三種參數玩法,讓數字生成變得超彈性。list()
與迴圈,做一些有趣的小應用。準備好,明天我們要讓數字「自動列隊」,讓程式更有效率地處理資料!
那麼,我們就明天見囉!!