元組(tuple):
Python 中的一種內置資料結構,用於儲存有序且不可變(immutable)的元素集合
與 list 不同,tuple 一旦創建後,其內容無法修改(例如添加、刪除或更改元素)
正因為其不可變性,tuple 通常用於儲存不應被修改的數據,例如固定配置、常量值或作為字典的鍵
特性:
- 有序性:tuple 中的元素按順序儲存,可以通過索引訪問
- 不可變性:tuple 創建後無法修改其內容
- 可嵌套:tuple 可以包含其他 tuple 或其他資料結構(如 list)
- 可哈希(Hashable):由於不可變性,tuple 可以作為字典的鍵或集合的元素
tuple v.s. list:
tuple通常可以用來取代串列,但tuple的功能較少,沒有append()、insert()等等
為何不使用串列來取代所有的tuple?
- tuple 不可變,list 可變
- tuple佔用的空間較少
- 不會不小心破壞tuple的項目(因為不可變)
- 可以將tuple當成字典鍵
- 可以將具名tuple當成物件的簡化替代品
- 函式引數是以tuple的形式傳入的
創建 tuple
1 2 3 4 5 6 7 |
# 用逗號區格 my_tuple_1 = (1, 2, 3) my_tuple_2 = 1, 2, 3 # 創建空tuple my_tuple_3 = tuple() my_tuple_4 = () |
tuple 方法:
count()、index()
1 2 3 4 5 6 7 8 9 10 |
# count(x) # 返回 tuple 中值為 x 的元素個數 my_tuple = (1, 2, 2, 3, 2) print(my_tuple.count(2)) # 3 # index(x[, start[, end]]) # 返回第一個值為 x 的元素的索引,可選參數 start 和 end 用於指定搜索範圍 my_tuple = (1, 2, 3, 2, 4) print(my_tuple.index(2)) # 輸出: 1 print(my_tuple.index(2, 2)) # 從索引 2 開始搜索,輸出: 3 |
tuple 常用操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# 索引與切片 my_tuple = (1, 2, 3, 4, 5) print(my_tuple[0]) # 1 print(my_tuple[1:4]) # (2, 3, 4) # 合併 Tuple # + 運算符可以合併兩個 tuple tuple1 = (1, 2, 3) tuple2 = (4, 5, 6) combined = tuple1 + tuple2 print(combined) # (1, 2, 3, 4, 5, 6) # 重複 Tuple # * 運算符可以重複 tuple my_tuple = (1, 2) repeated = my_tuple * 3 print(repeated) # (1, 2, 1, 2, 1, 2) # 使用 in 運算符檢查元素是否存在於 tuple 中 my_tuple = (1, 2, 3) print(2 in my_tuple) # True print(4 in my_tuple) # False # Unpacking # 將 tuple 中的元素解包到變數中 my_tuple = (1, 2, 3) a, b, c = my_tuple print(a, b, c) # 1 2 3 # tuple 可以包含其他 tuple 或其他資料結構 nested_tuple = (1, (2, 3), [4, 5]) print(nested_tuple[1]) # (2, 3) |
具名元組 (namedtuple)
namedtuple 是 Python 中 collections 模組提供的一個工廠函數,用於創建具有命名字段的輕量級元組子類,它結合了元組的不可變性和字典的可讀性,適合用來儲存簡單的資料結構
特點:
- 不可變性:創建後,namedtuple 的字段無法修改
- 命名字段:可以通過字段名稱來存取資料,提升程式碼的可讀性
- 記憶體高效:與普通類別相比,namedtuple 佔用的記憶體更少
namedtuple 適合用來儲存簡單的不可變資料,兼具元組的高效性和字典的可讀性,常用於替代簡單的類別或字典,如果你需要一個輕量且不可變的資料結構,namedtuple 是一個很好的選擇
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from collections import namedtuple Point = namedtuple('Point', ['x', 'y']) p = Point(10, 20) # 可以通過字段名稱或索引來存取資料 print(p.x) # 10 print(p[1]) # 20 # 嘗試修改字段會引發 AttributeError p.x = 30 # AttributeError # 其他方法 # _asdict():將 namedtuple 轉換為字典 print(p._asdict()) # {'x': 10, 'y': 20} # _replace():創建一個新的實例並替換指定字段 p_new = p._replace(x=30) print(p_new) # Point(x=30, y=20) |