在介紹了通用的序列操作後,我們來學習序列類型中的列表和元組 列表 回顧 我們已經初步學習了列表,在深入之前,讓我們簡單回顧一下以往的知識。 創建列表的方法: 給元素賦值: 刪除元素: 上一節我們還學習了分片、相加、乘法等通用序列操作,這裡就不過多闡述 分片賦值 在上一節中,我們介紹了通用的序列分片操 ...
在介紹了通用的序列操作後,我們來學習序列類型中的列表和元組
列表
回顧
我們已經初步學習了列表,在深入之前,讓我們簡單回顧一下以往的知識。
創建列表的方法:
>>> list_1 = [] # 創建空列表
>>> list_2 = list() # 創建空列表
>>> list_3 = [1,2,3,4] # 創建帶有元素的列表
>>> list_4 = list('abcd') # 創建一個列表 ['a','b','c','d'] (這是沒學習過的)
給元素賦值:
>>> x = [1,2,3]
>>> x[1] = 2 # 將索引為1的元素賦值為2
>>> x
[1, 2, 3]
刪除元素:
>>> del x[0]
>>> x
[2, 3]
上一節我們還學習了分片、相加、乘法等通用序列操作,這裡就不過多闡述
分片賦值
在上一節中,我們介紹了通用的序列分片操作。事實上,列表的分片操作並未在此停下腳步。
對於列表,我們還可以使用分片來批量賦值元素:
>>> x = list('abcd')
>>> x
['a', 'b', 'c', 'd']
>>> x[1:3] = list('ef') # 將索引為1和索引為2的元素分別替換成'e'、'f'
>>> x
['a', 'e', 'f', 'd']
用於替換的序列不必要與原序列等長:
>>> x = [1,2,3,4,5]
>>> x[1:3] = ['a', 'b', 'c'] # list_1[1:3]長度為2,但我們替換的序列長度為3
>>> x
[1, 'a', 'b', 'c', 4, 5]
如果對分片很熟悉,理解下麵這個分片操作應該不會有難度:
>>> x = [1,2,3]
>>> x[1:1]
[]
截取索引1到索引1(不包括1)的元素,因為第二個索引的元素是不包括在返回的序列中的,而第一個索引的又是這個不應包括的元素,所以返回了空序列。
想象一下,list_1[1:1]
這個空序列是索引0和索引1之間的“空隙”,那為什麼不是1和2之間呢?因為第二個索引1指定的是分片操作的終點,而分片又不包括終點,所以list_1[1:1]
當然是終點索引1之前的空隙了。
說到這裡,讀者們是否有想到什麼清奇的操作呢? (⊙ˍ⊙)
藉助這個看似奇怪的邏輯,我們可以插入一個序列 (°ー°〃)
>>> x = [1,2,3,4,5]
>>> x[1:1] = ['a','b','c']
>>> x
[1, 'a', 'b', 'c', 2, 3, 4, 5]
對上面的代碼,我們可以理解成把一個空序列“替換”成一個新的序列。
既然可以插入,那麼批量刪除也是可以的:
>>> x = [1,2,3,4,5]
>>> x[1:4] = []
>>> x
[1, 5]
列表方法
append
append方法用於給列表在末尾追加一個元素:
>>> x = [1,2,3]
>>> x.append(4)
>>> x
[1, 2, 3, 4]
pop
pop方法用於移除指定索引(預設為-1,即尾部)的元素,並且返回這個元素:
>>> x = [1,2,3]
>>> x.pop()
3
>>> x
[1, 2]
>>> x.pop(0) # 移除索引為0的元素
1
提示:利用append和pop可以實現電腦中十分常見的一種數據結構——棧,棧是一種後進先出(LIFO,Last In First Out)的數據結構,push操作把元素放入棧,像堆疊積木一樣,pop操作把頂層的“積木”移除,也就是最後放置的元素最先拿出,把列表當作棧,只需用append方法實現push操作,用pop方法實現pop操作。本系列教程不涉及更深的數據結構的學習,有興趣的讀者可以找找課程學習。
insert
insert方法可以把元素插入到指定的索引之前:
>>> x = [1,2,3]
>>> x.insert(1, 'a')
>>> x
[1, 'a', 2, 3]
使用分片賦值也是可以的:
>>> x = [1,2,3]
>>> x[1:1] = []
>>> x[1:1] = ['a']
>>> x
[1, 'a', 2, 3]
不過比起insert方法,分片賦值的方式可讀性比較差
remove
remove方法用於移除列表中某個元素的第一個匹配項:
>>> x = [1,2,3,2,1,3]
>>> x.remove(2)
>>> x
[1, 3, 2, 1, 3]
>>> x.remove(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
相信大家也看到,如果元素不存在,程式將拋出錯誤
index
index方法用於返回某個元素的第一個匹配項的索引:
>>> x = [1,2,3,2,1,3]
>>> x.index(3)
2
同樣的,如果元素不存在,則拋出錯誤:
>>> x.index(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 5 is not in list
count
count方法用於數數,數什麼數?數元素出現的次數:
>>> x = [1,2,3,2,2,1]
>>> x = [1,2,[2],2,[1,2],2]
>>> x.count(2)
3
>>> x.count([1,2])
1
>>> x.count(11)
0
extend
extend方法用於附加一個序列至列表末尾:
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
這個操作類似於序列相加操作:
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a = a + b
>>> a
[1, 2, 3, 4, 5, 6]
但是使用extend方法效率比較高
我們還可以使用分片賦值的方式來實現與extend相同的效果:
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a[len(a):] = b
>>> a
[1, 2, 3, 4, 5, 6]
但這比起extend,可讀性變差了,所以還是使用extend方法比較好
reverse
reverse方法用於翻轉列表:
>>> x = [1,2,3,4,5]
>>> x.reverse()
>>> x
[5, 4, 3, 2, 1]
如果僅僅想得到翻轉後的列表,而不修改原列表,可以使用反向索引的分片來實現:
>>> x = [1,2,3,4,5]
>>> x[::-1]
[5, 4, 3, 2, 1]
如果需要反向迭代列表,還可以使用reversed函數創建一個反向迭代列表的迭代器:
>>> x = [1,2,3,4,5]
>>> for i in reversed(x):
... print(i)
...
5
4
3
2
1
>>> list(reversed(x)) # 還可以使用list函數來將迭代器轉換成列表
[5, 4, 3, 2, 1]
sort
sort方法用於對列表進行排序。
>>> x = [3,2,4,8,6]
>>> x.sort()
>>> x
[2, 3, 4, 6, 8]
要註意的是這個方法是對原列表進行修改的,如果不想修改原列表而獲取排序結果,可以使用sorted函數:
>>> x = [3,2,4,8,6]
>>> sorted(x)
[2, 3, 4, 6, 8]
sort方法還可以自定義排序的方式,比如把10
排在1
之前,把'a'
排在3
之前等等,在python2中只需提供一個參數,這個參數是一個比較函數,但是python3取消了這個參數,需要使用其它方式來自定義排序的方式,這裡就不深入瞭解了,讀者們可以去python官網查看文檔學習。
元組
元組的基本操作和列表一樣,但是元組是不可修改的,所以沒有append、remove等修改序列的方法,只有count和index方法。
基本操作如下:
創建元組:
>>> tuple_1 = () # 空元組
>>> tuple_2 = tuple() # 空元組
>>> tuple_3 = 1,2,3
>>> tuple_4 = (1,2,3,4)
索引元素:
>>> x = (1,2,3,4)
>>> x[1]
2
count、index方法:
>>> x = (1,2,2,3,4,5,3,2)
>>> x.count(2)
3
>>> x.index(3)
3
還有分片、相加等通用序列操作,上節已介紹,這裡不過多闡述
元組的意義在於:
- 元組可以作為字典等映射類型的鍵,而列表不可以,因為鍵必須是不可變的,元組剛好就是不可變類型,而列表是可變類型。
- 函數返回多個值的時候,其實就是返回了一個元組,我們必須對元組進行處理。
好了,本節到此結束,下期再見!
ヾ( ̄▽ ̄)Bye~Bye~