Python 有兩個較常用的 sequence type:list 和 tuple,有些文章雖然也會把 string 列為 sequence type,不過嚴格來說,string 算是另一種類別的 sequence – Text Sequence Type,再加上有在另外一篇文章介紹過 string 了,所以這邊就不再提了。
延伸閱讀:Python 教學 5 – Python String Objects
Table of Contents
1. 特性
1.1 List, Tuple 的共通特性
- 通常用來儲存相同 type 的 object,但也可以儲存不同 type 的 object
- 有順序性
1.2 List, Tuple 的差別
List 和 Tuple 最大的差別在於:List 屬於 mutable sequence types,在宣告後仍可以對 list object 操作(新增、刪除、改變 list 內的 element);而 Tuple 屬於 immutable sequence type,在宣告後就不能對 tuple object 做操作,否則會噴錯。
my_list = [1, 2, 3]
my_list[0] = 0
print(my_list)
[0, 2, 3]
my_tuple = (1, 2, 3)
my_tuple[0] = 0
TypeError: 'tuple' object does not support item assignment
2. 宣告
2.1 宣告 list
2.1.1 square brackets: []
可以直接用中括號來宣告 list:
my_list = []
print(type(my_list))
<class 'list'>
my_list = [1, 2, 3]
print(type(my_list))
<class 'list'>
2.1.2 List Comprehension
Comprehension 是 Python 中特殊的表示法,詳細介紹可以參考:Python Comprehension 語法 – List Comprehension, Set Comprehension, Dict Comprehension。
List Comprehension 的語法:
[expression for item in iterable (if condition)]
至於 iterable 的定義,可以參考這篇:Python Iterable Objects 介紹
# List Comprehension 語法
my_list = [i for i in range(5)]
print(type(my_list))
<class 'list'>
print(my_list)
[0, 1, 2, 3, 4]
2.1.3 type constructor: list()
可以直接用 list 的 type constructor
class list([iterable])
只要 argument 是 iterable,就會回傳一個 list object:
my_str = 'hi'
print(list(my_str))
['h', 'i']
my_tuple = (1, 2)
print(list(my_tuple))
[1, 2]
my_dict = { 'name': 'jimmy', 'city': 'taipei' }
print(list(my_dict))
['name', 'city']
print(list(my_dict.values()))
['jimmy', 'taipei']
my_set = {1, 2}
print(list(my_set))
[1, 2]
2.2 宣告 Tuple
2.2.1 parentheses: ()
可以用小括號來宣告 tuple:
my_tuple = ()
print(type(my_tuple))
<class 'tuple'>
my_tuple = (1,)
print(type(my_tuple))
<class 'tuple'>
my_tuple = (1, 2, 3)
print(type(my_tuple))
<class 'tuple'>
2.2.2 trailing comma
也可以在宣告變數的時候,在 object 後面加上 ‘,’ 來宣告 tuple,但要用這種方式宣告 tuple 的話,要注意幾點:
- tuple 只有一個 element 的話,一定要在後面加上 ‘,’
- tuple 有兩個 elements 以上的話,最後一個 element 後面可加 ‘,’ ,也可以不加
my_num = 1
print(type(my_num))
<class 'int'>
my_tuple = 1,
print(type(my_tuple))
<class 'tuple'>
my_tuple = 1, 2
print(type(my_tuple))
<class 'tuple'>
my_tuple = 1, 2,
print(type(my_tuple))
<class 'tuple'>
2.2.3 type constructor: tuple()
可以直接用 tuple 的 type constructor
class tuple([iterable])
只要 argument 是 iterable,就會回傳一個 tuple object:
my_str = 'hi'
print(tuple(my_str))
('h', 'i')
my_list = [1, 2]
print(tuple(my_list))
(1, 2)
my_dict = { 'name': 'jimmy', 'city': 'taipei' }
print(tuple(my_dict))
('name', 'city')
print(tuple(my_dict.values()))
('jimmy', 'taipei')
my_set = {1, 2}
print(tuple(my_set))
(1, 2)
3. Common Sequence Operations
接著介紹一下 list 和 tuple 共用的一些操作
3.1 in
in 可以用來判斷這個元素是否在 list 或 tuple 裡面:
my_list = [1, 2, 3, 4, 5]
print(3 in my_list)
True
print(10 in my_list)
False
my_tuple = (1, 2, 3, 4, 5)
print(3 in my_tuple)
True
print(10 in my_tuple)
False
3.2 not in
跟 in 相反,用來判斷這個 element 是否不在 list 或 tuple 裡:
my_list = [1, 2, 3, 4, 5]
print(3 not in my_list)
False
print(10 not in my_list)
True
my_tuple = (1, 2, 3, 4, 5)
print(3 not in my_tuple)
False
print(10 not in my_tuple)
True
3.3 +
用來合併兩個 list 或 tuple,要注意,兩邊的 operand type 必須要一樣的,list 不能跟 tuple 作相加
相加不會改變原來的 list 或 tuple
my_list_1 = [1, 2, 3]
my_list_2 = [4, 5]
print(my_list_1 + my_list_2)
[1, 2, 3, 4, 5]
print(my_list_1)
[1, 2, 3]
my_tuple_1 = (1, 2, 3)
my_tuple_2 = (4, 5)
print(my_tuple_1 + my_tuple_2)
(1, 2, 3, 4, 5)
print(my_tuple_1)
(1, 2, 3)
3.4 *
將原本 list 或 tuple 的所有 element 重複放到新的 list 或 tuple object。
不會改變原來的 list 或 tuple object。
my_list = [1, 2, 3]
print(my_list * 3)
[1, 2, 3, 1, 2, 3, 1, 2, 3]
print(my_list)
[1, 2, 3]
my_tuple = (1, 2, 3)
print(my_tuple * 3)
(1, 2, 3, 1, 2, 3, 1, 2, 3)
print(my_tuple)
(1, 2, 3)
3.5 [index] – get element
[index] 可以取得該 index 所在的 element,但要注意,如果這個 index 超過 list 或 object 的 range 的話,會 raise IndexError: index out of range
my_list = [1, 2, 3]
# 取得 index == 0 的 element
print(my_list[0])
1
# 可以用 -1 取得倒數第一個 element,-2 取得倒數第二個 element,以此類推
print(my_list[-1])
3
print(my_list[3])
IndexError: list index out of range
my_tuple = (1, 2, 3)
print(my_tuple[0])
1
print(my_tuple[-1])
3
print(my_tuple[3])
IndexError: tuple index out of range
3.6 [i:j] – slice
[i:j] 可以取得 list 或 tuple 的特定範圍,會包含 index i,不包含 index j,有幾個規則:
- 如果忽略 i,那 default value 會是 0
- 如果忽略 j,那 default value 會是 len(object),也就是 list 或 object 的長度
my_list = [1, 2, 3, 4, 5]
print(my_list[1:3])
[2, 3]
print(my_list[2:])
[3, 4, 5]
print(my_list[:3])
[1, 2, 3]
my_tuple = (1, 2, 3, 4, 5)
print(my_tuple[1:3])
(2, 3)
print(my_tuple[2:])
(3, 4, 5)
print(my_tuple[:3])
(1, 2, 3)
3.6.1 特殊用法:[:] – copy
[:] 可以用來複製 list 或 tuple,會回傳一個新的一模一樣的 object:
my_list = [1, 2, 3, 4, 5]
print(my_list[:])
[1, 2, 3, 4, 5]
my_tuple = (1, 2, 3, 4, 5)
print(my_tuple[:])
(1, 2, 3, 4, 5)
3.6.2 特殊用法:[::-1] – reverse
[::-1] 可以用來反轉 list 或 tuple,會回傳新的 object,因此不會改變原來的 list 或 object
my_list = [1, 2, 3, 4, 5]
print(my_list[::-1])
[5, 4, 3, 2, 1]
print(my_list)
[1, 2, 3, 4, 5]
my_tuple = (1, 2, 3, 4, 5)
print(my_tuple[::-1])
(5, 4, 3, 2, 1)
print(my_tuple)
(1, 2, 3, 4, 5)
3.6.3 特殊用法:[i:j:k]
每隔幾個 k 才取 element:
my_list = list(range(10))
print(my_list[1:9])
[1, 2, 3, 4, 5, 6, 7, 8]
print(my_list[1:9:2])
[1, 3, 5, 7]
3.7 len()
len() 可以用來取得 list 或 tuple 的長度,也就是有幾個 element:
my_list = [1, 3, 4, 5, 9]
print(len(my_list))
5
my_tuple = (1, 3, 4, 5, 9)
print(len(my_tuple))
5
3.8 index(value)
index(value) function 可以用來找 list 或 object 是否有該 value 的 element,如有,就回傳第一個 element 的 index,否則會 raise ValueError: ... is not in list/tuple
my_list = [10, 3, 4, 5, 9]
print(my_list.index(4))
2
print(my_list.index(2))
ValueError: 2 is not in list
my_tuple = (10, 3, 4, 5, 9)
print(my_tuple.index(4))
2
print(my_tuple.index(2))
ValueError: 2 is not in tuple
3.9 count(value)
count(value) 用來計算 list 或 tuple 有幾個 element 是 value:
my_list = [10, 3, 4, 10, 9]
print(my_list.count(10))
2
print(my_list.count(4))
1
print(my_list.count(2))
0
my_tuple = (10, 3, 4, 10, 9)
print(my_tuple.count(10))
2
print(my_tuple.count(4))
1
print(my_tuple.count(2))
0
4. 操作 list
上述有提到,list 和 tuple 最大的差別在於:可以對 list 做一些操作(新增、刪除、修改 elements 等等),這一節就來介紹一些相關的 function 和語法:
4.1 list.append(x)
可以在 list object 直接呼叫 append function,將 x element 加到 list object 的末端。
append function 會回傳 None。
my_list = [10, 3, 4, 10, 9]
print(my_list.append(2))
None
print(my_list)
[10, 3, 4, 10, 9, 2]
4.2 list.insert(i, x)
將 list index == i 的 element 改為 x element,並將原本的 element 往後推。
my_list = [10, 3, 4, 10, 9]
print(my_list.insert(2, 30))
None
print(my_list)
[10, 3, 30, 4, 10, 9]
4.3 list.pop()
pop 有個 optional argument – index,不給的時候,呼叫 pop 會移除最後一個 element,給的話則會移除該 index 的 element。
pop() 會回傳移除的 element。
list.pop(index) 等同於 del list[index]
my_list = [10, 3, 4, 10, 9]
print(my_list.pop())
9
print(my_list)
[10, 3, 4, 10]
my_list = [10, 3, 4, 10, 9]
print(my_list.pop(2))
4
print(my_list)
[10, 3, 10, 9]
4.4 list.remove(x)
remove 會移除該 list 第一個 == x 的 element,如果沒有這個 element,會 raise ValueError
my_list = [10, 3, 4, 10, 9]
print(my_list.remove(10))
None
print(my_list)
[3, 4, 10, 9]
print(my_list.remove(0))
ValueError: list.remove(x): x not in list
4.5 del
del 可以用來刪除 list 的某個 element、某段 element,或是整個 list object
# 刪除特定 index 的 element
my_list = [10, 3, 4, 10, 9]
del my_list[2]
print(my_list)
[10, 3, 10, 9]
# 刪除某一段 list
my_list = [10, 3, 4, 10, 9]
del my_list[1:4]
print(my_list)
[10, 9]
# 清空整個 list
my_list = [10, 3, 4, 10, 9]
del my_list[:]
print(my_list)
[]
# 清除 list,釋放記憶體
my_list = [10, 3, 4, 10, 9]
del my_list
print(my_list)
NameError: name 'my_list' is not defined
4.6 list.extend(t) / list += t
t 必須為 iterable object,相當於將兩個 list 做 concatenation。
my_list = [10, 3, 4, 10, 9]
my_list.extend([1, 2, 3])
print(my_list)
[10, 3, 4, 10, 9, 1, 2, 3]
my_list = [10, 3, 4, 10, 9]
my_list += [1, 2, 3]
print(my_list)
[10, 3, 4, 10, 9, 1, 2, 3]
4.7 list.copy()
複製一個原本的 list object,相當於 list[:]。
my_list = [10, 3, 4, 10, 9]
my_new_list = my_list.copy()
print(my_new_list)
[10, 3, 4, 10, 9]
my_list = [10, 3, 4, 10, 9]
my_new_list = my_list[:]
print(my_new_list)
[10, 3, 4, 10, 9]
4.8 list.reverse()
反轉原本的 list object,會改變原本的 list object。
使用 list[::-1] 則不會改變原本的 list object。
my_list = [10, 3, 4, 10, 9]
my_list.reverse()
print(my_list)
[9, 10, 4, 3, 10]
my_list = [10, 3, 4, 10, 9]
my_new_list = my_list[::-1]
print(my_list)
[10, 3, 4, 10, 9]
print(my_new_list)
[9, 10, 4, 3, 10]
4.9 list.clear()
清空整個 list,變為 [],相當於 del list[:]。
my_list = [10, 3, 4, 10, 9]
my_list.clear()
print(my_list)
[]
my_list = [10, 3, 4, 10, 9]
del my_list[:]
print(my_list)
[]
參考資料
Python 列表(List) – 菜鸟教程
Built-in Types — Python 3.11.5 documentation
如果覺得我的文章有幫助的話,歡迎幫我的粉專按讚哦~謝謝你!