初學者指南:理解 Python 中的 list、set 和 tuple

更新日期: 2025 年 1 月 22 日

在學習 Python 的過程中,三種常見的資料型態——listsettuple,經常被用來存儲和操作資料。

它們看似相似,但實際上為不同的需求而設計。

在這篇文章中,我們將透過它們的相似點差異點,幫助你理解這些資料型態的用途,以及如何選擇合適的工具來解決問題。


相似點:它們有什麼共同之處?

Python 中的 listsettuple 都屬於容器型資料結構,專門用於存放多個元素,這些元素可以是不同類型的資料,例如數值、字串,甚至是物件。

儘管它們的內部結構和特性各不相同,但它們在某些核心功能上有許多相似之處。

容器型資料結構

多樣性

這三種資料型態都可以存放任意類型的元素。

你可以在其中混合數值、字串,甚至將其他資料結構(例如清單、字典)作為元素存放。

舉例來說:

# list
my_list = [1, "apple", [2, 3], {"key": "value"}]

# set
my_set = {1, "banana", 3.14}

# tuple
my_tuple = (1, "cherry", (4, 5))

這種靈活性讓它們可以用於處理多樣化的數據集合。

多元素存放


不像單一變數一次只能保存一個值,這三種容器型資料結構可以一次性存放多個值,方便管理和操作數據。

例如,若需要存儲一組產品清單或測量數據,使用這些結構比單獨存放每個數值更高效。

支援的基本操作

迭代(Iteration)
listsettuple 都支援迭代操作,可以用 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)

無論是有序的 listtuple,還是無序的 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 可以讓代碼變得簡單而高效。


差異點:它們有什麼不同?

以下表格展示了 listsettuple 在一些重要特性上的差異:

特性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 是理想選擇。

結語

listsettuple 是 Python 中設計精巧的資料型態,各自針對不同的使用場景進行了優化。

掌握它們的特性與用途,不僅可以讓你的程式更加高效,還能幫助你更靈活地應對不同的數據處理需求。

現在,試著將它們運用到你的程式中吧!

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *