在介紹 Python 的常用數(shù)據(jù)類型之前,我們先看看 Python 最基本的數(shù)據(jù)結(jié)構(gòu) - 序列(sequence)。
序列的一個(gè)特點(diǎn)就是根據(jù)索引(index,即元素的位置)來(lái)獲取序列中的元素,第一個(gè)索引是 0,第二個(gè)索引是 1,以此類推。
所有序列類型都可以進(jìn)行某些通用的操作,比如:
除了上面這些,我們還可以檢查某個(gè)元素是否屬于序列的成員,計(jì)算序列的長(zhǎng)度等等。
說(shuō)完序列,我們接下來(lái)看看 Python 中常用的數(shù)據(jù)類型,如下:
其中,列表、元組和字符串都屬于序列類型,它們可以進(jìn)行某些通用的操作,比如索引、分片等;字典屬于映射類型,每個(gè)元素由鍵(key)和值(value)構(gòu)成;集合是一種特殊的類型,它所包含的元素是不重復(fù)的。
序列中的元素可以通過(guò)索引獲取,索引從 0 開(kāi)始??纯聪旅娴睦樱?/p>
>>> nums = [1, 2, 3, 4, 5] # 列表
>>> nums[0]
1
>>> nums[1]
2
>>> nums[-1] # 索引 -1 表示最后一個(gè)元素
5
>>> s = 'abcdef' # 字符串
>>> s[0]
'a'
>>> s[1]
'b'
>>>
>>> a = (1, 2, 3) # 元組
>>> a[0]
1
>>> a[1]
2
注意到,-1 則代表序列的最后一個(gè)元素,-2 代表倒數(shù)第二個(gè)元素,以此類推。
索引用于獲取序列中的單個(gè)元素,而分片則用于獲取序列的部分元素。分片操作需要提供兩個(gè)索引作為邊界,中間用冒號(hào)相隔,比如:
>>> numbers = [1, 2, 3, 4, 5, 6]
>>> numbers[0:2] # 列表分片
[1, 2]
>>> numbers[2:5]
[3, 4, 5]
>>> s = 'hello, world' # 字符串分片
>>> s[0:5]
'hello'
>>> a = (2, 4, 6, 8, 10) # 元組分片
>>> a[2:4]
(6, 8)
這里需要特別注意的是,分片有兩個(gè)索引,第 1 個(gè)索引的元素是包含在內(nèi)的,而第 2 個(gè)元素的索引則不包含在內(nèi),也就是說(shuō),numbers[2:5] 獲取的是 numbers[2], numbers[3], numbers[4],沒(méi)有包括 numbers[5]。
下面列舉使用分片的一些技巧。
假設(shè)需要訪問(wèn)序列的最后 3 個(gè)元素,我們當(dāng)然可以像下面這樣做:
>>> numbers = [1, 2, 3, 4, 5, 6]
>>> numbers[3:6]
[4, 5, 6]
有沒(méi)有更簡(jiǎn)潔的方法呢?想到可以使用負(fù)數(shù)形式的索引,你可能會(huì)嘗試這樣做:
>>> numbers = [1, 2, 3, 4, 5, 6]
>>> numbers[-3:-1] # 實(shí)際取出的是 numbers[-3], numbers[-2]
[4, 5]
>>> numbers[-3:0] # 左邊索引的元素比右邊索引出現(xiàn)得晚,返回空序列
[]
上面的兩種使用方式并不能正確獲取序列的最后 3 個(gè)元素,Python 提供了一個(gè)捷徑:
>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8]
>>> numbers[-3:]
[6, 7, 8]
>>> numbers[5:]
[6, 7, 8]
也就是說(shuō),如果希望分片包含最后一個(gè)元素,可將第 2 個(gè)索引置為空。
如果要復(fù)制整個(gè)序列,可以將兩個(gè)索引都置為空:
>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8]
>>> nums = numbers[:]
>>> nums
[1, 2, 3, 4, 5, 6, 7, 8]
使用分片的時(shí)候,步長(zhǎng)默認(rèn)是 1,即逐個(gè)訪問(wèn),我們也可以自定義步長(zhǎng),比如:
>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8]
>>> numbers[0:4]
[1, 2, 3, 4]
>>> numbers[0:4:1] # 步長(zhǎng)為 1,不寫(xiě)也可以,默認(rèn)為 1
[1, 2, 3, 4]
>>> numbers[0:4:2] # 步長(zhǎng)為 2,取出 numbers[0], numbers[2]
[1, 3]
>>> numbers[::3] # 等價(jià)于 numbers[0:8:3],取出索引為 0, 3, 6 的元素
[1, 4, 7]
另外,步長(zhǎng)也可以是負(fù)數(shù),表示從右到左取元素:
>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8]
>>> numbers[0:4:-1]
[]
>>> numbers[4:0:-1] # 取出索引為 4, 3, 2, 1 的元素
[5, 4, 3, 2]
>>> numbers[4:0:-2] # 取出索引為 4, 2 的元素
[5, 3]
>>> numbers[::-1] # 從右到左取出所有元素
[8, 7, 6, 5, 4, 3, 2, 1]
>>> numbers[::-2] # 取出索引為 7, 5, 3, 1 的元素
[8, 6, 4, 2]
>>> numbers[6::-2] # 取出索引為 6, 4, 2, 0 的元素
[7, 5, 3, 1]
>>> numbers[:6:-2] # 取出索引為 7 的元素
[8]
這里總結(jié)一下使用分片操作的一些方法,分片的使用形式是:
# 左索引:右索引:步長(zhǎng)
left_index:right_index:step
要牢牢記住的是:
序列可以進(jìn)行「加法」操作,如下:
>>> [1, 2, 3] + [4, 5, 6] # 「加法」效果其實(shí)就是連接在一起
[1, 2, 3, 4, 5, 6]
>>> (1, 2, 3) + (4, 5, 6)
(1, 2, 3, 4, 5, 6)
>>> 'hello, ' + 'world!'
'hello, world!'
>>> [1, 2, 3] + 'abc'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list
這里需要注意的是:兩種相同類型的序列才能「加法」操作。
序列可以進(jìn)行「乘法」操作,比如:
>>> 'abc' * 3
'abcabcabc'
>>> [0] * 3
[0, 0, 0]
>>> [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
為了檢查一個(gè)值是否在序列中,可以使用 in 運(yùn)算符,比如:
>>> 'he' in 'hello'
True
>>> 'hl' in 'hello'
False
>>> 10 in [6, 8, 10]
True