初學者指南:理解 Python 中的 list、set 和 tuple
更新日期: 2025 年 1 月 22 日
本文為 容器型資料型態 介紹系列文,第 5 篇:
- Python 中的串列(List)詳解:新手指南
- 為什麼 Python 中的串列被稱為「串列」(List)而不是「陣列」(Array)
- Python 元組(Tuple)詳解:新手指南
- Python 集合(Set)詳解:新手指南
- 初學者指南:理解 Python 中的 list、set 和 tuple 👈 所在位置
- Python 字典(Dictionary)詳解:新手指南
在學習 Python 的過程中,三種常見的資料型態——list
、set
和 tuple
,經常被用來存儲和操作資料。
它們看似相似,但實際上為不同的需求而設計。
在這篇文章中,我們將透過它們的相似點和差異點,幫助你理解這些資料型態的用途,以及如何選擇合適的工具來解決問題。
相似點:它們有什麼共同之處?
Python 中的 list
、set
和 tuple
都屬於容器型資料結構,專門用於存放多個元素,這些元素可以是不同類型的資料,例如數值、字串,甚至是物件。
儘管它們的內部結構和特性各不相同,但它們在某些核心功能上有許多相似之處。
容器型資料結構
多樣性
這三種資料型態都可以存放任意類型的元素。
你可以在其中混合數值、字串,甚至將其他資料結構(例如清單、字典)作為元素存放。
舉例來說:
# list
my_list = [1, "apple", [2, 3], {"key": "value"}]
# set
my_set = {1, "banana", 3.14}
# tuple
my_tuple = (1, "cherry", (4, 5))
這種靈活性讓它們可以用於處理多樣化的數據集合。
多元素存放
不像單一變數一次只能保存一個值,這三種容器型資料結構可以一次性存放多個值,方便管理和操作數據。
例如,若需要存儲一組產品清單或測量數據,使用這些結構比單獨存放每個數值更高效。
支援的基本操作
迭代(Iteration):list
、set
和 tuple
都支援迭代操作,可以用 for
迴圈依次訪問每個元素,無需額外的轉換。
例如:
# 遍歷 list
for item in [1, 2, 3]:
print(item)
# 遍歷 set
for item in {4, 5, 6}:
print(item)
# 遍歷 tuple
for item in (7, 8, 9):
print(item)
無論是有序的 list
和 tuple
,還是無序的 set
,都可以輕鬆地逐一訪問元素,讓操作更加直觀。
成員檢查(Membership Testing)
可以使用 in
關鍵字快速檢查某個值是否存在於容器中。這是一個高效的操作,尤其是對於 set
,因為其底層是基於雜湊表設計,檢查速度非常快。
以下是成員檢查的範例:
# list 中檢查元素
my_list = [1, 2, 3]
print(2 in my_list) # 輸出: True
# set 中檢查元素
my_set = {4, 5, 6}
print(7 in my_set) # 輸出: False
# tuple 中檢查元素
my_tuple = (7, 8, 9)
print(8 in my_tuple) # 輸出: True
這項功能非常實用,例如當需要檢查用戶輸入的值是否在允許的選項清單中時,in
可以讓代碼變得簡單而高效。
差異點:它們有什麼不同?
以下表格展示了 list
、set
和 tuple
在一些重要特性上的差異:
特性 | list [ ] | set { } | tuple ( ) |
---|---|---|---|
順序 | 保持順序 | 不保證順序 | 保持順序 |
可變性 | 可變(Mutable) | 可變,但不允許重複值 | 不可變(Immutable) |
重複值 | 允許 | 不允許 | 允許 |
索引操作 | 支援索引存取(如 list[0] ) | 不支援索引 | 支援索引存取(如 tuple[0] ) |
效能 | 插入和刪除速度較慢,搜尋較慢 | 搜尋速度快(基於雜湊表) | 讀取速度最快 |
用途 | 用於需要有序、可變的集合 | 用於需要快速查找的無序集合 | 用於不可變、有序的集合 |
順序
- list:保持順序。元素按照插入的順序存儲,可以根據索引(如
list[0]
)存取特定元素。 - set:不保證順序。元素的排列順序可能會根據內部實現(如雜湊表)而變化,無法使用索引存取。
- tuple:保持順序。與 list 類似,元素按照插入順序存儲,且可以使用索引存取。
補充:什麼雜湊表?
這段文字說明了 set 資料結構在 Python 中的一個核心特性:元素的排列順序不固定。讓我們逐步拆解它的含義:
不保證順序
在 set 中,元素的存放方式並不是按照你插入的順序排列,而是由內部的 雜湊表(hash table) 決定其存放位置。
雜湊表的作用是基於元素的 雜湊值(hash value) 來快速定位和查找數據,而不是按照你插入時的順序排列。
範例:
my_set = {3, 1, 4, 2} print(my_set) # 輸出的順序可能是 {1, 2, 3, 4},但具體順序可能會變化
在這個範例中,即使插入順序是
3, 1, 4, 2
,輸出的順序不一定相同,因為 set 的內部不會維護插入順序。雜湊表是什麼?為什麼會影響順序?
雜湊表是一種資料結構,通過將每個元素的值轉換為一個唯一的雜湊值(hash),再根據雜湊值將元素分配到特定的位置。
雖然這種分配方式能夠實現高效的查找(時間複雜度為 O(1)),但它不會考慮元素的插入順序。
以生活情境比喻,假設你把郵件分類到不同的信箱,分類規則是根據信件的地址進行分配,而不是按照信件到達的先後順序。
這樣一來,信件的順序就不是固定的。
可變性
- list:是可變的(Mutable)。可以在原地修改,例如新增、刪除或更改元素,無需創建新的列表。
- 範例:
lst = [1, 2, 3]
lst.append(4) # lst 變為 [1, 2, 3, 4]
- set:也是可變的,但不允許重複值。元素可以新增或移除,但在加入時,Python 自動去重,確保集合內無重複。
- 範例:
st = {1, 2, 3}
st.add(2) # st 還是 {1, 2, 3}
- tuple:是不可變的(Immutable)。一旦創建後,無法修改其內容。如果需要更改,必須創建一個新元組。
- 範例:
tpl = (1, 2, 3)
# tpl[0] = 4 # 錯誤:tuple 是不可變的
重複值
- list:允許重複值,元素可以重複出現。
- 範例:
lst = [1, 2, 2, 3]
- set:不允許重複值。若嘗試加入重複的元素,Python 會自動忽略。
- 範例:
st = {1, 2, 2, 3} # 結果為 {1, 2, 3}
- tuple:允許重複值,與 list 相同。
- 範例:
tpl = (1, 2, 2, 3)
索引操作
- list:支援索引操作,可透過索引快速存取或修改元素。
- 範例:
lst = [1, 2, 3]
print(lst[1]) # 輸出 2
- set:不支援索引操作。由於 set 不保證元素順序,無法根據位置存取元素。如果需要遍歷 set,通常使用迴圈。
- 範例:
st = {1, 2, 3}
for item in st:
print(item)
- tuple:支援索引操作,與 list 類似,但因為不可變性,無法修改元素。
- 範例:
tpl = (1, 2, 3)
print(tpl[1]) # 輸出 2
效能
- list:在插入和刪除時速度較慢,尤其是在列表中間操作,因為需要移動其他元素。搜尋速度也比 set 慢,因為搜尋是線性時間 O(n)。
- set:搜尋速度非常快,因為內部基於雜湊表實現,搜尋是常數時間 O(1)。適合用於需要快速查找和去重的場景。
- tuple:讀取速度最快,因為其不可變性使得內存使用更高效,並且優化了訪問性能。
為什麼需要這三種資料型態?
list
的存在理由
- 用途:適合處理需要頻繁修改的有序數據。
- 優點:靈活的操作能力,例如插入、刪除、排序等。
- 應用場景:
- 建立一個待辦事項清單,經常需要新增或移除任務。
set
的存在理由
- 用途:適合需要快速檢查唯一值的情況,並提供集合運算功能(如交集、聯集等)。
- 優點:搜尋速度快,並自動過濾重複值。
- 應用場景:
- 統計文章中不重複的單詞數量。
- 在大數據集合中快速檢查某元素是否存在。
tuple
的存在理由
- 用途:適合處理不可變、需要高效存取的有序數據。
- 優點:不可變性確保數據安全,節省記憶體,讀取效能高。
- 應用場景:
- 儲存一組經緯度座標或其他需要保持不變的常量數據。
如何選擇正確的資料型態?
- 使用
list
:當你需要一個有序的集合,且數據可能需要頻繁修改(例如增刪、排序)時,list
是最佳選擇。 - 使用
set
:當你關注數據的唯一性或需要快速查找特定元素時,選擇set
。 - 使用
tuple
:當數據內容不會改變,並且需要高效、安全的處理方式時,tuple
是理想選擇。
結語
list
、set
和 tuple
是 Python 中設計精巧的資料型態,各自針對不同的使用場景進行了優化。
掌握它們的特性與用途,不僅可以讓你的程式更加高效,還能幫助你更靈活地應對不同的數據處理需求。
現在,試著將它們運用到你的程式中吧!