Python sequence

Python 教學 7 – Python Sequence Type: List, Tuple 介紹

Python 有兩個較常用的 sequence type:list 和 tuple,有些文章雖然也會把 string 列為 sequence type,不過嚴格來說,string 算是另一種類別的 sequence – Text Sequence Type,再加上有在另外一篇文章介紹過 string 了,所以這邊就不再提了。

延伸閱讀:Python 教學 5 – Python String Objects

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

如果覺得我的文章有幫助的話,歡迎幫我的粉專按讚哦~謝謝你!

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top