Previous slide Next slide Toggle fullscreen Open presenter view
一起玩Python程式:新手寫程式也可以這麼簡單!
Week 07: 資料容器(上) - 清單的魔法世界!
張傑帆
National Taiwan University
建立你的第一個寶物清單
方法一:直接建立
treasure_list = []
my_treasures = ["金幣" , "紅寶石" , "魔法書" , "銀劍" ]
print (my_treasures)
方法二:使用list()函數
empty_bag = list ()
spell_letters = list ("MAGIC" )
print (spell_letters)
清單索引:找到你的寶物位置
清單中每個物品都有一個地址 (索引)!
treasures = ["金幣" , "紅寶石" , "魔法書" , "銀劍" , "鑽石" ]
print (treasures[0 ])
print (treasures[2 ])
print (treasures[4 ])
print (treasures[-1 ])
print (treasures[-2 ])
小練習:寶物定位器
試著完成以下程式:
my_collection = ["古老地圖" , "神秘水晶" , "黃金匕首" , "魔法戒指" , "龍鱗盾牌" ]
first_treasure = my_collection[?]
last_treasure = my_collection[?]
third_treasure = my_collection[?]
print (f"第一個寶物:{first_treasure} " )
print (f"最後一個寶物:{last_treasure} " )
print (f"第三個寶物:{third_treasure} " )
增刪查改
操作類型
方法名稱
說明
範例程式碼
新增
append()
在清單末尾添加元素
my_list.append("新元素")
insert()
在指定位置插入元素
my_list.insert(索引, "新元素")
刪除
remove()
移除指定的元素
my_list.remove("元素")
pop()
移除並返回指定位置的元素
removed = my_list.pop(索引)
修改
直接賦值
修改指定位置的元素
my_list[索引] = "新值"
查詢
index()
獲取元素的索引位置
位置 = my_list.index("元素")
count()
統計元素出現的次數
次數 = my_list.count("元素")
操作類型
方法名稱
說明
範例程式碼
切片
批量查詢元素
子清單 = my_list[start:end:step]
其他
len()
獲取清單長度
長度 = len(my_list)
sort()
排序清單
my_list.sort() 或 my_list.sort(reverse=True)
reverse()
反轉清單順序
my_list.reverse()
copy()
複製清單
new_list = my_list.copy()
clear()
清空清單
my_list.clear()
清單的新增操作
append():在清單末尾添加新寶物
treasures = ["金幣" , "紅寶石" ]
treasures.append("魔法書" )
print (treasures)
treasures.append("銀劍" )
print (treasures)
insert():在指定位置插入寶物
treasures = ["金幣" , "紅寶石" , "魔法書" ]
treasures.insert(1 , "鑽石" )
print (treasures)
treasures.insert(0 , "皇冠" )
print (treasures)
清單的刪除操作
remove():移除指定的寶物
treasures = ["金幣" , "紅寶石" , "魔法書" , "銀劍" ]
treasures.remove("魔法書" )
print (treasures)
pop():取出指定位置的寶物
treasures = ["金幣" , "紅寶石" , "魔法書" , "銀劍" ]
removed_item = treasures.pop()
print (f"取出了: {removed_item} " )
print (treasures)
removed_item = treasures.pop(0 )
print (f"取出了: {removed_item} " )
print (treasures)
清單的修改操作
直接修改指定位置的寶物
treasures = ["舊劍" , "紅寶石" , "破盾" , "金幣" ]
treasures[0 ] = "神劍"
treasures[2 ] = "龍鱗盾"
print (treasures)
treasures[1 :3 ] = ["藍寶石" , "鑽石盾" ]
print (treasures)
小練習:寶物管理員
inventory = ["生鏽匕首" , "小金幣" , "破布衣" ]
inventory.append("?" )
inventory.insert(?, "?" )
inventory[?] = "?"
inventory.remove("?" )
print ("最終寶物清單:" , inventory)
休息一下,喝口水!
清單切片:批量操作的魔法
切片語法:列表[start:end:step]
treasures = ["金幣" , "銀幣" , "紅寶石" , "藍寶石" , "鑽石" , "翡翠" , "珍珠" ]
print (treasures[1 :4 ])
print (treasures[:3 ])
print (treasures[4 :])
print (treasures[::2 ])
print (treasures[1 ::2 ])
print (treasures[::-1 ])
清單的常用方法
len():計算寶物數量
treasures = ["金幣" , "紅寶石" , "魔法書" , "銀劍" ]
print (f"你總共有 {len (treasures)} 個寶物" )
count():統計特定寶物數量
bag = ["金幣" , "銀幣" , "金幣" , "寶石" , "金幣" ]
gold_count = bag.count("金幣" )
print (f"金幣數量: {gold_count} " )
index():找到寶物的位置
treasures = ["劍" , "盾" , "藥水" , "卷軸" ]
position = treasures.index("藥水" )
print (f"藥水在第 {position} 號位置" )
清單排序與整理
sort():依照順序排列
numbers = [100 , 50 , 200 , 75 ]
numbers.sort()
print (numbers)
numbers.sort(reverse=True )
print (numbers)
items = ["劍" , "盾" , "弓" , "斧" ]
items.sort()
print (items)
reverse():反轉清單順序
treasures = ["第一" , "第二" , "第三" , "第四" ]
treasures.reverse()
print (treasures)
清單的實用技巧
檢查物品是否存在
treasures = ["金幣" , "銀劍" , "魔法書" ]
if "金幣" in treasures:
print ("找到金幣!" )
if treasures.count("銀劍" ) > 0 :
print ("找到銀劍!" )
清單複製與合併
original = ["劍" , "盾" ]
copy1 = original.copy()
copy2 = original[:]
copy3 = list (original)
print (copy1)
print (copy2)
print (copy3)
weapons = ["劍" , "弓" ]
armor = ["盾" , "甲" ]
all_gear = weapons + armor
print (all_gear)
清單的進階應用
清單推導式 (List Comprehension)
numbers = [1 , 2 , 3 , 4 , 5 ]
squares = [x**2 for x in numbers]
print (squares)
treasures = [
{"name" : "金劍" , "value" : 1000 },
{"name" : "銀幣" , "value" : 10 },
{"name" : "鑽石" , "value" : 5000 }
]
expensive = [t["name" ] for t in treasures if t["value" ] > 500 ]
print (expensive)
多維清單:建立寶物倉庫
warehouse = [
["金劍" , "銀盾" , "魔法書" ],
["紅藥水" , "藍藥水" , "綠藥水" ],
["金幣" , "銀幣" , "寶石" ]
]
print (warehouse[0 ][1 ])
print (warehouse[2 ][0 ])
隨機寶物生成器
import random
def generate_random_treasure ():
"""隨機生成寶物"""
treasure_names = [
"神秘寶箱" , "古老卷軸" , "魔法水晶" , "龍鱗盾牌" ,
"傳說之劍" , "治療藥水" , "隱身斗篷" , "火焰戒指"
]
rarities = ["普通" , "稀有" , "史詩" , "傳說" ]
rarity_multipliers = {"普通" : 1 , "稀有" : 3 , "史詩" : 10 , "傳說" : 50 }
name = random.choice(treasure_names)
rarity = random.choice(rarities)
base_value = random.randint(10 , 100 )
final_value = base_value * rarity_multipliers[rarity]
return {
"name" : f"{rarity} {name} " ,
"value" : final_value,
"rarity" : rarity
}
for _ in range (5 ):
treasure = generate_random_treasure()
print (f"{treasure['name' ]} - 價值: {treasure['value' ]} " )
清單搜尋演算法
線性搜尋
def linear_search (treasure_list, target ):
"""線性搜尋寶物"""
for i, treasure in enumerate (treasure_list):
if treasure == target:
return i
return -1
treasures = ["金幣" , "銀劍" , "魔法書" , "紅寶石" ]
position = linear_search(treasures, "魔法書" )
if position != -1 :
print (f"找到魔法書在位置 {position} " )
else :
print ("找不到魔法書" )
綜合範例:寶物分類器
all_items = ["金劍" , "銀幣" , "魔法書" , "金幣" , "鐵盾" , "紅藥水" , "金戒指" , "藍藥水" ]
weapons = []
money = []
books = []
potions = []
jewelry = []
for item in all_items:
if "劍" in item or "盾" in item:
weapons.append(item)
elif "幣" in item:
money.append(item)
elif "書" in item:
books.append(item)
elif "藥水" in item:
potions.append(item)
elif "戒指" in item:
jewelry.append(item)
print (f"武器: {weapons} " )
print (f"金錢: {money} " )
print (f"書籍: {books} " )
print (f"藥水: {potions} " )
print (f"飾品: {jewelry} " )
實作專案:寶物收集管理系統
讓我們建立一個完整的寶物管理系統,並將所有功能整合成一支完整的程式!
def main ():
treasures = []
total_value = 0
while True :
print ("\n === 寶物管理系統 ===" )
print ("1. 添加寶物" )
print ("2. 移除寶物" )
print ("3. 搜尋寶物" )
print ("4. 顯示清單" )
print ("5. 最有價值寶物" )
print ("6. 離開" )
choice = input ("\n請選擇操作 (1-6): " )
(接上頁)
if choice == "1" :
name = input ("寶物名稱: " )
value = int (input ("寶物價值: " ))
treasure = {"name" : name, "value" : value}
treasures.append(treasure)
total_value += value
print (f" 成功添加寶物: {name} (價值: {value} )" )
elif choice == "2" :
name = input ("要移除的寶物名稱: " )
found = False
for treasure in treasures:
if treasure["name" ] == name:
treasures.remove(treasure)
total_value -= treasure["value" ]
print (f" 成功移除寶物: {name} " )
found = True
break
if not found:
print (f" 找不到寶物: {name} " )
(接上頁)
elif choice == "3" :
keyword = input ("搜尋關鍵字: " )
results = [treasure for treasure in treasures if keyword.lower() in treasure["name" ].lower()]
if results:
print ("\n 搜尋結果:" )
for treasure in results:
print (f"- {treasure['name' ]} (價值: {treasure['value' ]} )" )
else :
print (" 找不到相關寶物" )
elif choice == "4" :
print ("\n === 寶物清單 ===" )
if not treasures:
print ("背包是空的!" )
else :
for i, treasure in enumerate (treasures, 1 ):
print (f"{i} . {treasure['name' ]} - 價值: {treasure['value' ]} " )
print (f"\n 總價值: {total_value} " )
(接上頁)
elif choice == "5" :
if not treasures:
print ("背包是空的!" )
else :
most_valuable = max (treasures, key=lambda x: x["value" ])
print (f"\n 最有價值的寶物: {most_valuable['name' ]} (價值: {most_valuable['value' ]} )" )
elif choice == "6" :
print (" 再見!" )
break
else :
print (" 無效的選擇,請重新輸入!" )
if __name__ == "__main__" :
main()
運算思維總結
抽象化 (Abstraction)
清單是現實中「容器」概念的抽象
將複雜的資料管理簡化為基本操作
隱藏實作細節,專注於功能使用
問題分解 (Decomposition)
寶物管理 → 新增、刪除、搜尋、排序
複雜功能拆解為簡單的清單操作
每個子問題都有對應的方法解決
演算法思維 (Algorithmic Thinking)
了解不同操作的效能差異 (如:append vs insert)
選擇適當的資料結構和方法
設計高效的搜尋和排序策略
模式識別 (Pattern Recognition)
發現清單操作的共同模式
重複使用解決方案
建立可重用的程式碼模板
延伸學習資源
相關主題
元組 (Tuple) :不可變的有序容器
字典 (Dictionary) :鍵值對資料結構
集合 (Set) :不重複元素的容器
陣列 (Array) :數值專用的高效容器
實際應用領域
遊戲開發 :物品系統、技能樹管理
資料分析 :數據清理、統計分析
網站開發 :用戶清單、商品目錄
科學計算 :實驗數據、測量結果
進階技能
清單推導式(List Comprehension) :優雅的清單建立方式
生成器 (Generator) :記憶體效率的資料產生
NumPy陣列 :科學計算專用清單
pandas DataFrame :表格資料處理
本週總結
今天你學會了:
清單基礎 :建立、索引、切片操作
清單操作 :新增(append, insert)、刪除(remove, pop)、修改
常用方法 :len, count, index, sort, reverse
實際應用 :寶物管理系統的完整實作
運算思維 :抽象化、問題分解、演算法設計
下週預告
Week 08: 資料容器(下) - 字典的奧秘寶庫!
生活議題 : 打造遊戲背包系統,管理你的物品
課程內容 :
字典(Dictionary)基礎概念與語法
字典的鍵值配對操作
字典的新增、刪除、修改方法 (keys, values, items)
設計物品屬性結構 (名稱、類型、數量、價值)
建立物品分類與數量管理系統
實作背包容量限制與物品排序功能
作業:建立你的專屬收藏系統
作業要求:
三選一作業
選項一:基礎練習 (適合初學者)
建立一個簡單書櫃的書籍管理系統(選單介面),包含以下功能:
添加書籍到清單中。
搜尋書籍,根據關鍵字篩選結果。
移除特定書籍。
顯示目前的書籍清單。
結束程式。
若用戶輸入的並非這5項需提示錯誤,並要求重新輸入。
選項二:進階應用 (有點挑戰性)
智慧型購物清單系統
設計一個智慧型購物清單系統需具備以下功能:
商品分類(如食物、日用品等)。
價格估算與預算控制。
優先級排序(緊急、普通、可延後)。
購買歷史記錄與統計報告。
特殊要求:
使用多個清單管理不同類型資料
實作清單的排序和搜尋功能
加入資料驗證(例如:價格必須為正數)
提供統計報告功能
發揮創意,設計一個使用清單的實用程式!
-----------------------------------------
圖片放大特效
table樣式

<style scoped>
img[alt="Alt1"]{
background: rgba(255, 255, 255, 0);
position: absolute;
top: 10%;
left: 10%;
/* transform: translate(-50%, -50%); */
width: 200px; /* 調整圖片寬度 */
height: auto; /* 保持原始比例 */
padding:0;
margin:0;
z-index: 1;
}
img[alt="Alt2"]{
background: rgba(255, 255, 255, 0);
position: absolute;
top: 10%;
left: 75%;
/* transform: translate(-50%, -50%); */
width: 200px; /* 調整圖片寬度 */
height: auto; /* 保持原始比例 */
padding:0;
margin:0;
z-index: 2;
}
</style>
---
## Week 07: 資料容器(上) - 清單的魔法世界!
- **生活議題**: 成為寶物收集家,打造你的收藏清單
- **課程內容**:
- 清單(List)的基本概念與建立方法
- 清單的新增(append, insert)、刪除(remove, pop)、修改操作
- 清單切片與索引使用 ([start:end:step])
- 清單的常用方法 (len, sort, reverse, count, index)
- 建立寶物收集系統
- 實作新增寶物功能與搜尋功能
- **運算思維**:
- **抽象化**: 理解清單作為資料集合的抽象概念
- **演算法思維**: 學習資料的增刪查改操作邏輯
- **問題分解**: 將資料管理需求分解為基本操作
---
## 🎪 清單的有趣應用
### 洗牌與抽獎系統
```python
import random
def treasure_lottery(participants, prizes):
"""寶物抽獎系統"""
if len(participants) < len(prizes):
print("參與者不足!")
return
# 洗牌參與者清單
shuffled = participants.copy()
random.shuffle(shuffled)
# 分發獎品
winners = {}
for i, prize in enumerate(prizes):
winners[shuffled[i]] = prize
print("🎉 抽獎結果 🎉")
for winner, prize in winners.items():
print(f"{winner} 獲得了 {prize}!")
# 使用範例
players = ["勇者", "法師", "弓箭手", "盜賊", "牧師"]
rewards = ["傳說之劍", "魔法法杖", "神速之弓"]
treasure_lottery(players, rewards)
```
### 二元搜尋(需要排序的清單)
```python
def binary_search(sorted_list, target):
"""二元搜尋(更快速)"""
left, right = 0, len(sorted_list) - 1
while left <= right:
mid = (left + right) // 2
if sorted_list[mid] == target:
return mid
elif sorted_list[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
```
---
## 📈 效能優化技巧
### 清單 vs 其他資料結構的選擇
```python
import time
# 在清單末尾添加元素:O(1) - 很快
def test_append_performance():
treasure_list = []
start = time.time()
for i in range(100000):
treasure_list.append(f"寶物{i}")
end = time.time()
print(f"添加10萬個元素耗時: {end - start:.4f} 秒")
# 在清單開頭插入元素:O(n) - 較慢
def test_insert_performance():
treasure_list = []
start = time.time()
for i in range(1000): # 注意:只測試1000個
treasure_list.insert(0, f"寶物{i}")
end = time.time()
print(f"在開頭插入1000個元素耗時: {end - start:.4f} 秒")
```
---
## 🎨 創意專案:ASCII 寶物展示
```python
def display_treasure_ascii(treasures):
"""用ASCII藝術展示寶物"""
treasure_art = {
"金幣": "💰",
"寶石": "💎",
"劍": "⚔️",
"盾": "🛡️",
"書": "📚",
"藥水": "🧪"
}
print("🏛️ === 寶物展示館 === 🏛️")
print("┌" + "─" * 40 + "┐")
for i, treasure in enumerate(treasures, 1):
# 找出對應的圖示
icon = "📦" # 預設圖示
for key, art in treasure_art.items():
if key in treasure:
icon = art
break
print(f"│ {i:2d}. {icon} {treasure:<30} │")
print("└" + "─" * 40 + "┘")
# 使用範例
my_treasures = ["古老金幣", "龍血寶石", "傳說之劍", "魔法盾牌", "咒語書", "治療藥水"]
display_treasure_ascii(my_treasures)
```
## 🏆 實作專案:寶物收集管理系統
讓我們建立一個完整的寶物管理系統!
```python
class TreasureManager:
def __init__(self):
self.treasures = []
self.total_value = 0
def add_treasure(self, name, value):
"""添加新寶物"""
treasure = {"name": name, "value": value}
self.treasures.append(treasure)
self.total_value += value
print(f"✅ 成功添加寶物: {name} (價值: {value})")
def remove_treasure(self, name):
"""移除寶物"""
for treasure in self.treasures:
if treasure["name"] == name:
self.treasures.remove(treasure)
self.total_value -= treasure["value"]
print(f"🗑️ 成功移除寶物: {name}")
return
print(f"❌ 找不到寶物: {name}")
```
---
## 💎 寶物管理系統 - 完整版
```python
def search_treasure(self, keyword):
"""搜尋寶物"""
found = []
for treasure in self.treasures:
if keyword.lower() in treasure["name"].lower():
found.append(treasure)
return found
def show_inventory(self):
"""顯示所有寶物"""
print("\n🎒 === 寶物清單 ===")
if not self.treasures:
print("背包是空的!")
return
for i, treasure in enumerate(self.treasures, 1):
print(f"{i}. {treasure['name']} - 價值: {treasure['value']}")
print(f"\n💰 總價值: {self.total_value}")
def get_most_valuable(self):
"""找出最有價值的寶物"""
if not self.treasures:
return None
return max(self.treasures, key=lambda x: x["value"])
```
---
## 🎮 互動式寶物管理系統
```python
def main():
manager = TreasureManager()
while True:
print("\n🏰 === 寶物管理系統 ===")
print("1. 添加寶物")
print("2. 移除寶物")
print("3. 搜尋寶物")
print("4. 顯示清單")
print("5. 最有價值寶物")
print("6. 離開")
choice = input("\n請選擇操作 (1-6): ")
if choice == "1":
name = input("寶物名稱: ")
value = int(input("寶物價值: "))
manager.add_treasure(name, value)
elif choice == "4":
manager.show_inventory()
# 執行程式
if __name__ == "__main__":
main()
```
---
## ✨ 進階練習:寶物統計分析
```python
def analyze_treasures(treasure_list):
"""分析寶物收集統計"""
if not treasure_list:
print("沒有寶物可以分析!")
return
# 計算統計資料
values = [t["value"] for t in treasure_list]
stats = {
"總數量": len(treasure_list),
"總價值": sum(values),
"平均價值": sum(values) / len(values),
"最高價值": max(values),
"最低價值": min(values)
}
print("\n📊 === 寶物統計分析 ===")
for key, value in stats.items():
if "價值" in key:
print(f"{key}: {value:.2f}")
else:
print(f"{key}: {value}")
```
---
## 🏆 挑戰任務:超級寶物管理器
建立一個進階的寶物管理系統,包含以下功能:
```python
class AdvancedTreasureManager:
def __init__(self):
self.treasures = []
self.categories = {}
self.history = []
# 挑戰1: 實作分類管理
def add_category(self, category_name):
pass # 你來實作
# 挑戰2: 實作寶物評級系統
def rate_treasure(self, treasure_name, rating):
pass # 你來實作
# 挑戰3: 實作交易歷史記錄
def trade_treasure(self, treasure_name, trader_name):
pass # 你來實作
# 挑戰4: 實作寶物推薦系統
def recommend_treasures(self, user_preferences):
pass # 你來實作
```
### 🌟 重點回顧:
- 清單是Python中最重要的資料結構之一
- 索引從0開始,負索引從-1開始
- 善用切片可以高效處理資料批次操作
- 選擇適當的方法來達成不同的操作需求
```python
# 書籍清單
books = []
# 添加書籍
books.append("Python 程式設計")
books.append("資料結構與演算法")
books.append("人工智慧導論")
books.append("機器學習基礎")
books.append("深度學習應用")
# 搜尋書籍
keyword = "人工"
search_results = [book for book in books if keyword in book]
print("搜尋結果:")
for book in search_results:
print(book)
# 移除書籍
books.remove("資料結構與演算法")
# 顯示所有書籍
print("\n目前書籍清單:")
for book in books:
print(book)
```
**評分重點:**
- 創意性和實用性 (40%)
- 程式碼品質和結構 (30%)
- 功能完整性 (20%)
- 使用者體驗設計 (10%)