2026年9月21日 星期一

Python容器實作:我的出國自由行規劃

Python容器實作:我的出國自由行規劃

Python初學list, tuple, dict, set

課程挑戰:如果你準備和同學出國自由行,如何使用Python整理景點、日期、航班、住宿、預算及大家共同想去的地方?本篇文章暫時不使用 ifforwhile,專心練習容器的建立、讀取、修改與選擇。

一、為什麼要學容器?

程式不只處理一個數字或一句文字,經常需要同時管理很多資料。例如,旅遊規劃中可能有五個景點、多項費用、一筆航班資料,以及不同組員的願望清單。Python提供不同容器,協助我們依照資料特性進行整理。

旅遊資料需求適合容器選擇原因
有先後順序的景點list 串列可以新增、刪除、修改及調整順序
出發日期、座標tuple 元組用來表達一組不希望任意更動的資料
航班、飯店、景點資料dict 字典可以利用欄位名稱取得對應內容
組員共同想去的景點set 集合排除重複,並可進行交集、聯集及差集

二、實作1:為旅程取一個名稱

字串 str 是由文字依序組成的容器。先輸入想去的國家、城市及旅遊天數,再組合成行程名稱。

country = input("請輸入旅遊國家:")
city = input("請輸入旅遊城市:")
days = input("請輸入旅遊天數:")

tour_name = f"{country}{city}{days}日自由行"

print(f"我的旅遊計畫:{tour_name}")
print(f"城市名稱共有 {len(city)} 個字")
動手做:輸入自己真正想去的國家與城市,不必和老師的範例相同。

三、實作2:建立想去的景點清單

串列適合保存「有順序,而且可能調整」的資料。以下用東京景點示範。

places = ["淺草寺", "東京晴空塔", "上野公園", "澀谷", "東京鐵塔"]

print(f"完整景點:{places}")
print(f"第一個景點:{places[0]}")
print(f"最後一個景點:{places[-1]}")
print(f"前三個景點:{places[:3]}")
print(f"景點數量:{len(places)}")
執行前先預測:
  1. places[1] 的結果是什麼?
  2. places[-2] 的結果是什麼?
  3. places[1:4] 會包含哪些景點?

四、實作3:調整旅遊景點

自由行最常遇到行程異動。利用串列方法練習新增、插入、修改及刪除景點。

places = ["淺草寺", "東京晴空塔", "上野公園", "澀谷"]

# 新增在最後面
places.append("東京鐵塔")
print(f"新增後:{places}")

# 插入索引1的位置
places.insert(1, "秋葉原")
print(f"插入後:{places}")

# 修改原本位於索引3的景點
places[3] = "上野動物園"
print(f"修改後:{places}")

# 刪除指定景點
places.remove("東京鐵塔")
print(f"刪除後:{places}")
學生任務:建立自己的五個景點,完成新增、插入、修改及刪除各一次,最後顯示第一站、最後一站及景點總數。

五、實作4:安排每天的行程

尚未學習迴圈時,可先用不同變數保存每天的行程。

day1 = ["成田機場", "飯店", "淺草寺"]
day2 = ["上野公園", "秋葉原", "東京車站"]
day3 = ["明治神宮", "原宿", "澀谷"]

print(f"第一天:{day1}")
print(f"第二天:{day2}")
print(f"第三天:{day3}")

# 調整第二天行程
day2.append("東京晴空塔")
day2.remove("秋葉原")
print(f"調整後的第二天:{day2}")

# 交換第一天的第二站與第三站
day1[1], day1[2] = day1[2], day1[1]
print(f"交換後的第一天:{day1}")

六、實作5:用元組保存固定資料

元組適合表達一組相對固定、不希望在程式中被任意改動的資料,例如日期或座標。

1. 出發日期

departure_date = (2027, 1, 20)
year, month, day = departure_date

print(f"出發年份:{year}")
print(f"出發月份:{month}")
print(f"出發日期:{day}")
print(f"完整日期:{year}/{month}/{day}")

2. 景點座標

sensoji_location = (35.7148, 139.7967)
latitude, longitude = sensoji_location

print(f"淺草寺緯度:{latitude}")
print(f"淺草寺經度:{longitude}")
錯誤也是教材:試著執行 sensoji_location[0] = 35.7000,觀察錯誤訊息。元組建立後不能直接修改;如果資料需要頻繁調整,串列通常更合適。

七、實作6:建立景點電子資料卡

字典以「鍵與值」保存資料,適合描述一個景點的多項屬性。

place = {
    "名稱": "淺草寺",
    "城市": "東京",
    "類型": "文化景點",
    "門票": 0,
    "停留時間": "2小時"
}

print(f"景點名稱:{place['名稱']}")
print(f"所在城市:{place['城市']}")
print(f"景點類型:{place['類型']}")
print(f"門票:{place['門票']} 元")

# 修改既有資料
place["停留時間"] = "3小時"

# 增加新資料
place["交通方式"] = "搭乘地鐵"
place["推薦美食"] = "人形燒"

print(f"建議停留:{place['停留時間']}")
print(f"交通方式:{place['交通方式']}")
print(f"推薦美食:{place['推薦美食']}")
學生任務:選擇一個想去的景點,建立包含「名稱、國家、城市、類型、門票、停留時間、交通方式」的字典。

八、實作7:整理航班與住宿資料

flight = {
    "航空公司": "範例航空",
    "航班編號": "AB123",
    "出發機場": "桃園國際機場",
    "抵達機場": "成田國際機場",
    "出發時間": "08:30",
    "抵達時間": "12:30"
}

hotel = {
    "名稱": "東京城市飯店",
    "住宿天數": 4,
    "每晚費用": 1800,
    "鄰近車站": "上野站"
}

print(f"航班:{flight['航班編號']}")
print(f"飛行路線:{flight['出發機場']} → {flight['抵達機場']}")
print(f"住宿飯店:{hotel['名稱']}")
print(f"住宿費用:{hotel['住宿天數'] * hotel['每晚費用']} 元")
以上航班、時間及價格均為程式練習用的假設資料,不是訂票資訊。實際旅行前應查閱航空公司、旅館及官方旅遊資訊。

九、實作8:比較組員想去的景點

集合沒有固定順序,但可以排除重複項目,並快速比較兩人的旅遊偏好。

student_a = {"淺草寺", "東京晴空塔", "秋葉原", "澀谷"}
student_b = {"淺草寺", "東京鐵塔", "澀谷", "迪士尼樂園"}

print(f"共同想去:{student_a & student_b}")
print(f"全部推薦:{student_a | student_b}")
print(f"A同學特別想去:{student_a - student_b}")
print(f"B同學特別想去:{student_b - student_a}")
運算寫法旅遊規劃意義
交集A & B兩人共同想去的景點
聯集A | B兩人提出的全部景點
差集A - BA提出但B沒有提出的景點

十、實作9:估算旅遊預算

只有金額時可以使用串列;需要知道每筆金額的意義時,字典更加清楚。

budget = {
    "機票": 12000,
    "住宿": 7200,
    "餐費": 5000,
    "交通": 3000,
    "門票": 3500
}

total = sum(budget.values())

print(f"機票:{budget['機票']} 元")
print(f"住宿:{budget['住宿']} 元")
print(f"餐費:{budget['餐費']} 元")
print(f"交通:{budget['交通']} 元")
print(f"門票:{budget['門票']} 元")
print(f"預估總旅費:{total} 元")
print(f"最高單項費用:{max(budget.values())} 元")
print(f"最低單項費用:{min(budget.values())} 元")

十一、綜合實作:我的出國自由行企畫

分組挑戰:3至4人一組,選擇一個想去的國家與城市,完成可執行的Python旅遊企畫。
容器任務要求
str輸入國家、城市、天數,產生行程名稱
list建立至少五個有順序的景點,並完成新增、插入、修改及刪除
tuple建立出發日期及一個景點的經緯度
dict建立景點資料卡、航班或住宿資料,以及旅費預算
set比較兩位組員的景點清單,找出交集、聯集及差集

綜合程式範例

country = "日本"
city = "大阪"
days = 5
tour_name = f"{country}{city}{days}日自由行"

places = ["大阪城", "道頓堀", "心齋橋", "通天閣", "環球影城"]
departure_date = (2027, 1, 20)

hotel = {
    "名稱": "大阪城市飯店",
    "住宿天數": 4,
    "每晚費用": 1800,
    "鄰近車站": "難波站"
}

budget = {
    "機票": 12000,
    "住宿": 7200,
    "餐費": 5000,
    "交通": 3000,
    "門票": 3500
}

my_choices = {"大阪城", "道頓堀", "環球影城"}
partner_choices = {"大阪城", "海遊館", "環球影城"}

print(f"行程名稱:{tour_name}")
print(f"旅遊景點:{places}")
print(f"出發日期:{departure_date}")
print(f"住宿資料:{hotel}")
print(f"預估總旅費:{sum(budget.values())} 元")
print(f"共同想去:{my_choices & partner_choices}")
print(f"全部推薦:{my_choices | partner_choices}")

十二、三小時課程安排

時間課程活動進行方式
0~20分鐘旅遊資料分類與容器選擇全班討論
20~55分鐘景點串列、索引、切片與修改個人實作
55~75分鐘日期、座標與元組錯誤觀察兩人合作
75~85分鐘休息
85~120分鐘景點、航班、住宿與預算字典個人實作
120~140分鐘比較組員的景點集合兩人合作
140~170分鐘完成出國自由行企畫分組實作
170~180分鐘成果展示與概念檢核口頭發表

十三、個人作業與分組作業

作業類型內容繳交成果
個人建立五個景點,練習索引、切片及串列修改程式與執行畫面
個人建立一張景點字典資料卡程式與輸出結果
兩人比較兩人的景點集合交集、聯集與差集結果
分組整合景點、日期、住宿、預算及共同偏好自由行企畫程式與3分鐘報告

十四、評量方式

評量項目比例
正確建立並操作不同容器30%
能依資料需求選擇適合容器25%
程式可以執行且輸出清楚20%
能說明每種容器的選擇理由15%
分組合作與成果發表10%

十五、課後檢核

  1. 需要保存有順序且可以修改的景點,應使用哪種容器?
  2. 需要保存不希望任意更動的日期或座標,應使用哪種容器?
  3. 需要用「航空公司」「航班編號」等欄位查找資料,應使用哪種容器?
  4. 需要找出兩位同學共同想去的景點,應使用哪種容器與運算?
  5. 為什麼集合不適合直接保存旅遊參觀順序?
本課重點:
有順序、可修改的資料使用 list;一組不希望任意改動的資料使用 tuple;有欄位名稱的資料使用 dict;排除重複及比較共同項目使用 set。真正重要的不是背下語法,而是看到資料需求時,能選擇適合的容器。

沒有留言:

張貼留言