在測試的時候,很常需要作大量的數據處理,在 Python 我們會常用到這些資料結構 (list
, tuple
, set
, dict
) 來組織和存儲數據以便有效地訪問和操作。不同的資料結構在不同的操作上有不同的性能優勢,因此需要理解這些資料結構的分別,日後可根據應用的需求來選擇使用。
list
, tuple
, set
和 dict
的差異與應用由一連串資料組成,資料的型別可以不同,有順序性,內容可被改變。
以 []
來作標記,並以 (,
) 來分隔資料。
由於 list 是有順序性,可以 索引 (index) 來取 list
中的數值。索引為 list
元素的順位,從 0 開始計算。
# a_list 跟 b_list 的內容相同,但順序不同,會被視為 2 個不相同的 List
a_list = [1, 'a', 2, 'b']
b_list = ['a', 1, 'b', 2]
print(a_list == b_list)
print(a_list[0]) # 取得第 1 位的值
print(b_list[3]) # 取得第 4 位的值
print(a_list[-1]) # 取得倒數第 1 位的值
# 亦可修改 list 的內容
a_list[0] = 4
print(a_list)
Output:
False
1
2
'b'
[4, "a", 2, "b"]
list
是有 迭代性 (iterable),可以通過 for
loop 來取得當中的值,寫法可以有 3 種:
num_list = [2, 4, 6, 8]
for num in num_list:
print(num)
num_list = [2, 4, 6, 8]
# 利用內建的 len() 取得 list 的資料數量
# 再用 range() 取得 list 每個元素的 index
for index in range(len(num_list))
# index 分別會是 0, 1, 2, 3
print(num_list[index])
# enumerate() 是內建函數,可同時取得 list 的 index 和值。
# 當需要同時取得 list 的 index 和值的時候很有用。
for index, num in enumerate(num_list):
print(index)
print(num)
list
相對是最常用的容器型別,並非不可變的資料 / 需要作集合的運算時,都會使用 list
儲存多個資料。
同樣由一連串資料組成,資料的型別可以不同,亦有順序性,但內容定義後則不能改變。
以 ()
來作標記,並以 (,
) 來分隔資料。
與 list
相似,可以 index
取值,也可以用 for
loop 取得每個元素。
a_tuple = (1, "a", 2, "b")
# 會出現錯誤,因為 tuple 不能修改內容
a_tuple[0] = 3
Output:
==> TypeError: 'tuple' object does not support item assignment
應用跟 list
相似,只能儲存一些不會被變更的資料,但執行的效比 List 好。
同樣由一連串資料組成,資料的型別可不同,內容可改變,但沒有順序,還有一個特點是內容不可重複。概念跟數學的集合相似。
以 {}
來作標記,並以 (,
) 來分隔資料。
由於沒有順序性,不能用 index
取值
但有迭代性,可用 for
loop 取得每個元素。由於 set
是沒有順序,所以取得值的順序跟添加的順序可能不一樣。
a_list = [1, 1, "a", "a"]
# 可應用 set() 把 a_list 轉換成 set,過程中會把相同的資料刪除。
a_set = set(a_list)
print(a_set)
# 會出現錯誤,因為沒有順序性,所以不能用 index 取值。
print(a_set[0])
Output:
{1, 'a'}
==> TypeError: 'set' object is not subscriptable
一般應用在應用集合的運算,如交集,聯集,差集等數學運算,這類型的運算執行效率比 list
好。還有一種用法是用來刪除重複的元素。
如同字典的應用,以鍵 key 做為索引以取得字典裡面的值 value ,稱為 key-value pair。當中 Key 必須是唯一的。
以 {"key":"value"}
作標記,以 (,
) 來分隔不同的 key-value
沒有順序性,無法用 index
取值,需要以 key
取值。
# 建立有 3 對 key-value 的字典
person_a = {
"name": "mary",
"sex": "F",
"age": 20
}
# 可應用 Key 取值
print(person_a["name"])
print(person_a["age"])
Output:
"mary"
20
而 dict
的 key
是有迭代性的,可用 for
loop 取得 dict
內的每一個 key
,從而得到對應的值。
person_a = {
"name": "mary",
"sex": "F",
"age": 20
}
# dict 的內建 function keys(),可以取得 dict 的所有 key list
# 再透過 for loop 讀取每個 key
for key in person_a.keys():
print(f"{key}: {person_a[key]}")
Output:
name: mary
sex: F
age: 20
一般 dict
是用作包裝大量的資訊。如上例可包裝個人資料。日後作 API 測試,將會透過 API 取得回傳的資料,將會是以 dict
的格式存儲,因此將會應用 dict
作大量的操作。
順序性 | 迭代性 | 內容可變 | 應用範圍 | |
---|---|---|---|---|
list | 有 | 有 | 可 | 最常用的容器型態 |
tuple | 有 | 有 | 不可 | 儲存一些不會被變更的資料 |
set | 沒有 | 有 | 可 | 集合的運算 |
dict | 沒有 | 當中的 key 有迭代性 | 可 | 用作包裝大量的資訊 |
以上只是它們的簡單介紹,而每種容器型別都有內建的 function 作對應的數據處理,可參看 Python 的官方文件了解它們的各種用法。
基礎的程式語法介紹到這裡了,應該已經有能力可以處理很多的問題,只是需要時間練習而已。
明天再來說演算法和 Big O Notation,來認識程式的效能比較。