2026年8月30日 星期日

水井村農漁產資料該用List、Tuple、Dict還是Set?

Python一下|第4篇

水井村農漁產資料該用List、Tuple、Dict還是Set?

《從風土資料到智慧生活的程式設計》——資料容器沒有最好的一種,只有最適合任務的一種。

本篇學習目標
  • 比較List、Tuple、Dict與Set的共同點及差異。
  • 理解有序、重複、可修改與鍵值對等特性。
  • 依照USR場域需求選擇適合的資料容器。
  • 練習新增、讀取、修改、刪除及成員檢查。
  • 完成一份整合四種容器的水井村農漁產資料摘要。

一、為什麼需要資料容器?

單一變數適合記住一筆資料;當我們要記錄水井三寶、四家溫室番茄園、多個感測值或「農業、漁業、畜業」等不重複類別時,一個變數顯然不夠。Python提供多種資料容器,讓相關資料可以放在一起管理。

List

有順序
可修改的清單

Tuple

有順序
不希望被修改

Dict

鍵對應值
用名稱找資料

Set

不重複
適合集合運算

二、先看四種容器比較表

容器符號有順序可修改可重複適合情境
List串列[]會新增、刪除、排序的工作清單
Tuple元組()固定座標、固定欄位、公告後標準
Dict字典{key: value}依加入順序保存鍵不可重複,值可重複用欄位名稱查找感測資料
Set集合{value}不以位置索引去除重複、交集、聯集及差集
快速判斷:需要順序又會修改,用List;資料固定不應修改,用Tuple;需要「名稱→資料」,用Dict;只在乎不重複成員或集合關係,用Set。

三、List:會變動的水井三寶導覽清單

List使用中括號,可以依索引讀取,也能新增、修改與刪除。

treasures = ["白馬", "烏龜", "姻緣花"]

print(treasures)
print(treasures[0])
print(treasures[-1])
print(len(treasures))
['白馬', '烏龜', '姻緣花'] 白馬 姻緣花 3

新增、修改與刪除

tour_stops = ["姻緣樹", "柴井車"]

tour_stops.append("智慧養殖場")
tour_stops[0] = "百年姻緣樹"
tour_stops.remove("柴井車")

print(tour_stops)
適合List的USR資料:參訪行程、待辦事項、逐時感測值、活動報名名單、可調整順序的導覽景點。

四、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)
重要觀念:Tuple的不可修改只限制Tuple本身的元素指向;若其中放入可修改物件,內部物件仍可能改變。初學階段先把它理解為「固定結構、避免意外重新指定」。

五、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,也可自訂預設文字。
適合Dict的USR資料:一筆感測紀錄、商品資料、長者故事欄位、活動基本資料、API傳回的JSON物件。

六、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)
適合Set的USR資料:參與者去重、標籤、已完成任務、兩場活動的共同參加者、不同資料來源的農產名稱比對。

七、同一份資料,選錯容器會怎樣?

需求較適合不理想的選法與原因
依時間保存24筆水溫ListSet會移除重複值且不適合依位置對應時間
保存固定GPS座標TupleList雖可用,但容易被意外修改
描述一筆養殖池資料DictList必須記住每個位置代表什麼
找出兩場活動共同參與者SetList需自行處理重複與比對
依序安排導覽景點ListSet不適合表達固定行程順序
四問選擇法:
  1. 資料需要依順序存取嗎?
  2. 資料執行中需要修改嗎?
  3. 重複資料有意義嗎?
  4. 要用位置找資料,還是用欄位名稱找資料?

八、容器可以互相轉換

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]用在SetSet不支援位置索引改用List,或用in檢查成員
修改Tuple元素Tuple不可直接指定元素重新建立Tuple,或需求本來就該用List
data["水溫"]找不到Dict中沒有該鍵先用in檢查或使用get()
建立空Set卻寫{}{}代表空Dict使用set()
把List直接放入SetList可修改,不能作為Set元素改成Tuple或其他不可變資料

十二、漸進式練習

基礎:選擇容器

判斷下列資料適合List、Tuple、Dict或Set:導覽行程、GPS座標、一筆長者故事欄位、參與者去重名單。

進階:資料轉換

建立含有重複農漁產名稱的List,轉成Set去重,再排序成新List,最後轉成Tuple作為公告版清單。

USR挑戰:設計場域資料模型

以List of Dict建立三座養殖池,每筆包含名稱、水溫、溶氧與設備狀態;再建立Set整理資料中出現的設備狀態。先畫出資料結構,才開始寫程式。

十三、學習檢核

  1. List和Tuple最重要的差異是什麼?
  2. 為什麼一筆感測資料適合用Dict?
  3. Set為什麼不適合保存逐時水溫?
  4. {}建立的是哪一種空容器?
  5. ponds[1]["水溫"]分成哪兩個查找步驟?
  6. 什麼情況下重複資料不是錯誤,反而必須保留?

十四、AI協作提示詞

請擔任Python資料結構助教。
我要整理一份USR場域資料,請先詢問:
1. 資料是否需要順序;2. 是否會修改;
3. 是否允許重複;4. 要用位置或欄位名稱查找。

請依我的回答,判斷應使用List、Tuple、Dict或Set,
先說明選擇理由,再提供最小範例。
若需要巢狀結構,請先用文字畫出層次,
不要增加我沒有提供的地方人物、數據或成果。

十五、延伸閱讀

十六、本篇小結

List、Tuple、Dict與Set都能容納多筆資料,但它們表達的意義不同。選擇資料容器不是記憶符號,而是先理解場域資料如何產生、是否重複、會不會變動,以及未來要如何查找。

先理解地方資料之間的關係,再選擇Python容器;好的資料結構,本身就是對場域的清楚描述。
系列:《Python一下:從風土資料到智慧生活的程式設計》
上一篇:《用文蛤養殖數據學會資料型別、變數與運算子》
下一篇:《智慧養殖設備異常判斷——if、elif、巢狀判斷與in》
教學定位:國立虎尾科技大學USR × 水井村地方資料 × Python資料結構

沒有留言:

張貼留言