水井村農漁產資料該用List、Tuple、Dict還是Set?
《從風土資料到智慧生活的程式設計》——資料容器沒有最好的一種,只有最適合任務的一種。
- 比較List、Tuple、Dict與Set的共同點及差異。
- 理解有序、重複、可修改與鍵值對等特性。
- 依照USR場域需求選擇適合的資料容器。
- 練習新增、讀取、修改、刪除及成員檢查。
- 完成一份整合四種容器的水井村農漁產資料摘要。
一、為什麼需要資料容器?
單一變數適合記住一筆資料;當我們要記錄水井三寶、四家溫室番茄園、多個感測值或「農業、漁業、畜業」等不重複類別時,一個變數顯然不夠。Python提供多種資料容器,讓相關資料可以放在一起管理。
List
有順序
可修改的清單
Tuple
有順序
不希望被修改
Dict
鍵對應值
用名稱找資料
Set
不重複
適合集合運算
二、先看四種容器比較表
| 容器 | 符號 | 有順序 | 可修改 | 可重複 | 適合情境 |
|---|---|---|---|---|---|
| List串列 | [] | 是 | 是 | 是 | 會新增、刪除、排序的工作清單 |
| Tuple元組 | () | 是 | 否 | 是 | 固定座標、固定欄位、公告後標準 |
| Dict字典 | {key: value} | 依加入順序保存 | 是 | 鍵不可重複,值可重複 | 用欄位名稱查找感測資料 |
| Set集合 | {value} | 不以位置索引 | 是 | 否 | 去除重複、交集、聯集及差集 |
三、List:會變動的水井三寶導覽清單
List使用中括號,可以依索引讀取,也能新增、修改與刪除。
treasures = ["白馬", "烏龜", "姻緣花"]
print(treasures)
print(treasures[0])
print(treasures[-1])
print(len(treasures))新增、修改與刪除
tour_stops = ["姻緣樹", "柴井車"]
tour_stops.append("智慧養殖場")
tour_stops[0] = "百年姻緣樹"
tour_stops.remove("柴井車")
print(tour_stops)四、Tuple:固定的番茄園與場域座標
Tuple使用小括號。建立後不能直接更改元素,適合表示不希望在程式執行中被誤改的資料。
tomato_farms = (
"水哥玫瑰番茄園",
"首都番茄園",
"水井屋番茄園",
"樂天番茄園"
)
print(tomato_farms[0])
print(len(tomato_farms))只有一個元素的Tuple
one_product = ("文蛤",)
print(type(one_product))逗號不能省略;("文蛤")只是被括號包住的字串。
拆包Unpacking
location = (23.5, 120.2)
latitude, longitude = location
print("緯度:", latitude)
print("經度:", longitude)五、Dict:一座養殖池的感測資料
Dict以「鍵:值」儲存資料。與其記住水溫在第0格、溶氧在第1格,不如直接用"水溫"與"溶氧"查找,程式更容易閱讀。
pond = {
"名稱": "一號文蛤養殖池",
"水溫": 28.5,
"鹽度": 18.2,
"溶氧": 5.8,
"設備在線": True
}
print(pond["名稱"])
print(pond["水溫"])
print(pond.get("酸鹼值", "尚未提供資料"))新增、修改與刪除
pond["酸鹼值"] = 7.8
pond["水溫"] = 29.0
removed_value = pond.pop("鹽度")
print(pond)
print("移除的鹽度:", removed_value)pond["酸鹼值"]在鍵不存在時會產生錯誤;pond.get("酸鹼值")則會得到None,也可自訂預設文字。六、Set:不重複的農漁畜產業類別
Set不保留重複元素,也不以索引位置讀取,適合做成員檢查及集合運算。
industries = {"農業", "漁業", "畜業", "漁業", "農業"}
print(industries)
print("漁業" in industries)重複的「農業」與「漁業」只會保留一份。Set輸出順序不應被當成固定排序。
空集合不能寫成{}
empty_set = set()
empty_dict = {}
print(type(empty_set))
print(type(empty_dict))交集、聯集與差集
group_a = {"白馬", "烏龜", "文蛤"}
group_b = {"烏龜", "姻緣花", "文蛤"}
print("共同認識:", group_a & group_b)
print("全部主題:", group_a | group_b)
print("A組獨有:", group_a - group_b)七、同一份資料,選錯容器會怎樣?
| 需求 | 較適合 | 不理想的選法與原因 |
|---|---|---|
| 依時間保存24筆水溫 | List | Set會移除重複值且不適合依位置對應時間 |
| 保存固定GPS座標 | Tuple | List雖可用,但容易被意外修改 |
| 描述一筆養殖池資料 | Dict | List必須記住每個位置代表什麼 |
| 找出兩場活動共同參與者 | Set | List需自行處理重複與比對 |
| 依序安排導覽景點 | List | Set不適合表達固定行程順序 |
- 資料需要依順序存取嗎?
- 資料執行中需要修改嗎?
- 重複資料有意義嗎?
- 要用位置找資料,還是用欄位名稱找資料?
八、容器可以互相轉換
products = ["文蛤", "烏魚", "文蛤", "番茄"]
unique_products = set(products)
sorted_products = sorted(unique_products)
fixed_products = tuple(sorted_products)
print("去除重複:", unique_products)
print("排序後串列:", sorted_products)
print("固定為Tuple:", fixed_products)轉換容器時,資料特性也會改變:轉成Set會去除重複;sorted()會產生排序後的List;轉成Tuple後不能直接修改元素。
九、巢狀容器:多座養殖池資料
真實資料常把不同容器組合。例如用List保存多筆紀錄,每筆紀錄用Dict描述欄位:
ponds = [
{"名稱": "一號池", "水溫": 28.5, "溶氧": 5.8},
{"名稱": "二號池", "水溫": 29.1, "溶氧": 5.4},
{"名稱": "三號池", "水溫": 27.9, "溶氧": 6.0}
]
print(ponds[0]["名稱"])
print(ponds[1]["水溫"])ponds[1]先取得第二筆Dict,再用["水溫"]取得該筆的水溫。十、水井村農漁產資料摘要
# List:可調整順序的導覽主題
tour_topics = ["水井三寶", "智慧養殖", "地方農漁產"]
# Tuple:固定的水井三寶名稱
shuijing_treasures = ("白馬", "烏龜", "姻緣花")
# Dict:一筆農漁產資料
clam_product = {
"名稱": "文蛤",
"來源": "雲林沿海養殖",
"單位": "公斤",
"可供導覽": True
}
# Set:不重複的產業類別
industry_types = {"農業", "漁業", "畜業", "漁業"}
print("導覽主題:", tour_topics)
print("水井三寶:", shuijing_treasures)
print("農漁產資料:", clam_product)
print("產業類別:", industry_types)
print("是否包含漁業:", "漁業" in industry_types)十一、常見錯誤
| 錯誤 | 原因 | 修正 |
|---|---|---|
items[0]用在Set | Set不支援位置索引 | 改用List,或用in檢查成員 |
| 修改Tuple元素 | Tuple不可直接指定元素 | 重新建立Tuple,或需求本來就該用List |
data["水溫"]找不到 | Dict中沒有該鍵 | 先用in檢查或使用get() |
建立空Set卻寫{} | {}代表空Dict | 使用set() |
| 把List直接放入Set | List可修改,不能作為Set元素 | 改成Tuple或其他不可變資料 |
十二、漸進式練習
基礎:選擇容器
判斷下列資料適合List、Tuple、Dict或Set:導覽行程、GPS座標、一筆長者故事欄位、參與者去重名單。
進階:資料轉換
建立含有重複農漁產名稱的List,轉成Set去重,再排序成新List,最後轉成Tuple作為公告版清單。
USR挑戰:設計場域資料模型
以List of Dict建立三座養殖池,每筆包含名稱、水溫、溶氧與設備狀態;再建立Set整理資料中出現的設備狀態。先畫出資料結構,才開始寫程式。
十三、學習檢核
- List和Tuple最重要的差異是什麼?
- 為什麼一筆感測資料適合用Dict?
- Set為什麼不適合保存逐時水溫?
{}建立的是哪一種空容器?ponds[1]["水溫"]分成哪兩個查找步驟?- 什麼情況下重複資料不是錯誤,反而必須保留?
十四、AI協作提示詞
請擔任Python資料結構助教。
我要整理一份USR場域資料,請先詢問:
1. 資料是否需要順序;2. 是否會修改;
3. 是否允許重複;4. 要用位置或欄位名稱查找。
請依我的回答,判斷應使用List、Tuple、Dict或Set,
先說明選擇理由,再提供最小範例。
若需要巢狀結構,請先用文字畫出層次,
不要增加我沒有提供的地方人物、數據或成果。十五、延伸閱讀
十六、本篇小結
List、Tuple、Dict與Set都能容納多筆資料,但它們表達的意義不同。選擇資料容器不是記憶符號,而是先理解場域資料如何產生、是否重複、會不會變動,以及未來要如何查找。
先理解地方資料之間的關係,再選擇Python容器;好的資料結構,本身就是對場域的清楚描述。
沒有留言:
張貼留言