輕鬆初探 Python 篇(四)—list tuple range 知識彙總

WeaponZhi發表於2017-11-28

這是「AI 學習之路」的第 4 篇,「Python 學習」的第 4 篇
小之的公眾號 : WeaponZhi

今天的主題是 Python 的序列型別(Sequence Types),內容很多,乾貨很足,也是我們平時經常使用的,大家準備好小板凳紙筆吧!

注意,我不準備再將迴圈語句和條件語句方面的知識了,比較簡單,每種語言這方面的寫法區分不大,有興趣的大家可以自行去查閱一下。

list

list 是一種有序集合,在很多語言裡面都有支援,像 Java 中的 List ,可以簡單理解 List 是一個順序表,可以對它進行新增和刪除元素的操作,但和 Java 不同,Java 的 List 並不是內建的,它的一些實現類比如 ArrayList 是用 Java 程式碼另外實現的,而 list 在 Python 中是一種內建資料型別,它是和語言本身是一體的。

list 的使用很簡單,用方括號[]表示,內部的元素用逗號「,」區分。比如,我們用 list 來表示我國的幾個城市的名字:

>>> city = ['北京','上海','天津','重慶']
>>> city
['北京','上海','天津','重慶']複製程式碼

我們可以用索引來訪問 list 中指定位置的元素,這部分有點像 Java 的陣列

>>> city[0]
'北京'
>>> city[3]
'重慶'
>>> len(city)
4
>>> city[4]
IndexError:list index out of range複製程式碼

這裡要注意下,索引是從 0 開始,而不是從 1,所以最後一個重慶的索引實際上是 3,當我們試圖訪問位置為 4 的時候,就會產生索引越界的錯誤。

通過 len() 函式可以獲取 list 的長度,所以實際上 list 的最後一個元素的索引是len(city)-1。

空的 list 長度為 0:

>>> L = []
>>> len(L)
0複製程式碼

當然我們也可以從後往前進行索引,-1代表最後一個,-2代表倒數第二個,以此類推。

>>> city[-1]
重慶
>>> city[-2]
天津
>>> city[-5]
IndexError:list index out of range複製程式碼

list 中元素的資料型別是不一定是一樣的,甚至可以再巢狀一個 list:

>>> L = ['小之',23,False,['Android','Python','Java']]
>>> len(L)
4複製程式碼

L 中的另一個 list 整體只算一個元素,你可以把它理解為一個二維陣列,可以通過L[3][1]呼叫到這個 list 中的Python元素。

list 常用的函式

list 是一個可變有序表,所以可以往 list 中塞資料,使用append()函式將把元素塞到末尾

>>> city.append('南京')
>>> city
['北京','上海','天津','重慶','南京']複製程式碼

我們還可以使用insert()來把元素插入到指定位置

>>> city.insert(2,'蘇州')
>>> city
['北京','上海','蘇州','天津','重慶','南京']複製程式碼

通過pop()可以獲取 list 末尾的元素,並且刪除該元素,pop(i)可以刪除並返回指定位置的元素

>>> city.pop()
'南京'
>>> city.pop(0)
'北京'
>>> city
['上海','蘇州','天津','重慶']複製程式碼

使用remove(x)來移除某一個特定的元素x

>>> city.remove('上海')
>>> city
['蘇州','天津','重慶']複製程式碼

使用reverse()來將 list 逆序

>>> city.reverse()
>>> city
['重慶','天津','蘇州']複製程式碼

如果想作拼接可以有兩種方式,一種是通過extend(),一種是通過+

>>> L2 = ['北京']
>>> L+L2
['重慶','天津','蘇州','北京']
>>> L.extend(L2)
>>> L
['重慶','天津','蘇州','北京']複製程式碼

注意,L+L2並不會改變 L 的值,而extend是會改變呼叫 list 本身的值的,所以extend實際上可以和L += L2等價

你還可以通過city *= n來將 list 重複 n 次塞入到本身

>>> L = ['1','2']
>>> L *= 3
>>> L
['1','2','1','2','1','2']複製程式碼

tuple

tuple 叫元祖,是另一種有序列表,tuple 和 list 很像,但是 tuple 初始化後就不能再被修改了,除了一些插入刪除操作比如append,pop不能使用,其他的使用和 list 基本一致。

>>> city = ('北京','上海','南京')
>>> city[0]
'北京'
>>> city[-1]
'南京'複製程式碼

注意,在定義一個 tuple 的時候,tuple 的元素就被確定下來了,之後你將無法改變它,這樣做的意義是 tuple 的不可變性可以使得程式碼更加安全,如果可以,你應該儘量使用 tuple 來替代 list。

當你定義只有一個元素的 tuple 的時候,注意需要在後面加一個「,」號,以免引起歧義。(1)是可以代表數字 1 的。

>>> t = (1)
>>> t
1
>>> t = (1,)
>>> t
(1,)複製程式碼

tuple 的「不可變」並不意味著元素完全不可變,而是代表 tuple 元素的指向是不可變的,tuple 的元素可以是一些「可變的」元素,比如 list:

>>> t = ('北京','上海',['重慶','南京'])
>>> t[2][0] = '天津'
>>> t
('北京','上海',['天津','南京'])複製程式碼

我們可以看到 tuple 中的 list 元素已經改變了,但實際上 tuple 的元素指向的仍然還是這個 list,總而言之,tuple 需要保證的是「指向不變」,而如果你需要保證內容不變,那就得保證元素本身是不可變的。

range

我們最後介紹一下range。range 也是一個不可變的序列,它通常是使用在一些迴圈語句中。

>>> list(range(10))
[0,1,2,3,4,5,6,7,8,9]
>>> list(range(1,11))
[1,2,3,4,5,6,7,8,9,10]
>>> list(range(0,30,5))
[0,5,10,15,20,25]
>>> list(range(0,10,3))
[0,3,6,9]
>>> list(range(0,-10,-1))
[0,-1,-2,-3,-4,-5,-6,-7,-8,-9]
>>> list(range(0))
[]
>>> list(range(1,0))
[]複製程式碼

list 函式將把可遍歷的資料型別轉化為 list。我們通過以上程式碼發現,range(10)是 0-9 的數列,在一個引數的時候是從 0 開始的序列。range(1,11)代表從第一個引數開始,第二個引數為止的數列,注意,這裡的範圍是[1,11),包括第一個引數,不包括第二個引數。三個引數,在兩個引數的基礎上增加了一個 step 用來表示每次增幅的數量,如果某一次增幅超過了一邊範圍,則割捨掉這個值。

如果沒有第三個引數,則預設所有的 step 都是 +1,如果開始值和結束值大小寫反了,將會返回一個空列表。

一般我們會在 for 語句中使用 range()

>>> L = []
>>> for i in range(10):
...     L.append(i)
...
>>> L
[0,1,2,3,4,5,6,7,8,9]複製程式碼

序列型別的一些其他用法

通用序列操作

下面說的操作和函式都是通用操作,不管是不是可變序列,都可以使用。我們先定義一個測試列表:

L = [1,2,3,4,5]複製程式碼

x in L, x not in L

x 代表元素,L 代表列表,x in L 中如果 L 中有元素和 x 相等,就返回 True,否則返回 False,x not in L 相反。

>>> 1 in L
True
>>> 0 in L
False
>>> 1 not in L
False
>>> 0 not in L
True複製程式碼

L + T

這個我們之前也講過了,通過「+」可以拼接兩個序列

>>> T = [6]
>>> L + T
[1,2,3,4,5,6]複製程式碼

L * n

將 L 重複塞入自己 n 次,得到一個新的列表

>>> L * 2 
[1,2,3,4,5,6,1,2,3,4,5,6]複製程式碼

len(L)

獲取列表長度

>>> len(L)
12複製程式碼

min(L)、max(L)

獲取列表中的最大最小值

>>> min(L)
1
>>> max(L)
6複製程式碼

L.index(x)

獲取 x 在 L 中第一次出現的位置

>>> L = (1,2,1,3)
>>> L.index(1)
0複製程式碼

index 還有兩個變種,可以新增兩個引數,index(x,i)和 index(x,i,j)。

如果只增加一個引數,那就是獲取從這個引數位置開始到列表結尾這個範圍中,第一次出現 x 的位置,如果增加兩個引數,則返回從 i 至 j (不包括 j)範圍中第一次出現 x 的位置。

>>> L.index(1,1)
2
>>> L.index(1,1,3)
2複製程式碼

如果找不到,將會丟擲ValueError錯誤

L.count(x)

返回 x 在 L 中出現的次數

>>> L.count(1)
2複製程式碼

可變序列操作

下面介紹一些可變序列獨有的操作,tuple 是無法使用的。

除了之前介紹 list 時提到的諸如appendremove以外,還有一些比較有用的函式。

L.clear()

清空列表中所有的元素

>>> L.clear()
>>> L
[]複製程式碼

L.copy

新建一份相同的列表。

>>> L = [1,2,3]
>>> A = L.copy()
>>> A
[1,2,3]
>>> A.append(1)
>>> A
[1,2,3,1]
>>> L
[1,2,3]複製程式碼

以上介紹了一些序列型別的一些基本操作,還有一些類似「切片」、「迭代」、「生成器」等高階操作,將在後續的文章中為大家介紹。


歡迎關注我的公眾號

相關文章