Python最常用的兩種集合類型:list
和tuple
文搂,我們可以用list
和tuple
來表示有序集合。
1.Python創(chuàng)建list
Python內(nèi)置的一種數(shù)據(jù)類型是列表: list
茉盏。list
是一種有序的集合,可以隨時添加和刪除其中的元素。
比如钮呀,列出班里所有同學(xué)的名字扛邑,就可以用一個list
表示:
>>> ['Michael', 'Bob', 'Tracy']
['Michael', 'Bob', 'Tracy']
list
是數(shù)學(xué)意義上的有序集合怜浅,也就是說,list
中的元素是按照順序排列的。
構(gòu)造list
非常簡單恶座,按照上面的代碼搀暑,直接用 [ ]
把list
的所有元素都括起來,就是一個list
對象跨琳。通常自点,我們會把list
賦值給一個變量,這樣脉让,就可以通過變量來引用list
:
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates # 打印classmates變量的內(nèi)容
['Michael', 'Bob', 'Tracy']
由于Python是動態(tài)語言桂敛,所以list
中包含的元素并不要求都必須是同一種數(shù)據(jù)類型,我們完全可以在list
中包含各種數(shù)據(jù):
>>> L = ['Michael', 100, True]
一個元素也沒有的list溅潜,就是空list:
>>> empty_list = []
2.Python按照索引訪問list
由于list
是一個有序集合术唬,所以,我們可以用一個list
按分?jǐn)?shù)從高到低表示出班里的3個同學(xué):
>>> L = ['Adam', 'Lisa', 'Bart']
那我們?nèi)绾螐膌ist中獲取指定第 N 名的同學(xué)呢滚澜?方法是通過索引來獲取list
中的指定元素粗仓。
需要特別注意的是,索引從 0 開始设捐,也就是說借浊,第一個元素的索引是0,第二個元素的索引是1萝招,以此類推巴碗。
因此,要打印第一名同學(xué)的名字即寒,用L[0]
:
>>> print L[0]
Adam
要打印第二名同學(xué)的名字橡淆,用 L[1]
:
>>> print L[1]
Lisa
要打印第三名同學(xué)的名字,用 L[2]
:
>>> print L[2]
Bart
要打印第四名同學(xué)的名字母赵,用 L[3]
:
>>> print L[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
報錯了逸爵!IndexError
意思就是索引超出了范圍,因為上面的list
只有3個元素凹嘲,有效的索引是 0
师倔,1
,2
周蹭。
所以趋艘,使用索引時,千萬注意不要越界凶朗!不要越界瓷胧!不要越界!重要的事情說三遍棚愤。搓萧。
3.Python之倒序訪問list
我們還是用一個list
按分?jǐn)?shù)從高到低表示出班里的3個同學(xué):
>>> L = ['Adam', 'Lisa', 'Bart']
這時杂数,老師說,請分?jǐn)?shù)最低的同學(xué)站出來瘸洛。
要寫代碼完成這個任務(wù)揍移,我們可以先數(shù)一數(shù)這個 list
,發(fā)現(xiàn)它包含3個元素反肋,因此那伐,最后一個元素的索引是2:
>>> print L[2]
Bart
有沒有更簡單的方法?
有石蔗!
Bart同學(xué)是最后一名喧锦,俗稱倒數(shù)第一,所以抓督,我們可以用 -1
這個索引來表示最后一個元素:
這個是和Objective-C以及Java明顯的區(qū)別
>>> print L[-1]
Bart
Bart同學(xué)表示躺槍燃少。
類似的,倒數(shù)第二用 -2
表示铃在,倒數(shù)第三用 -3
表示阵具,倒數(shù)第四用 -4
表示:
>>> print L[-2]
Lisa
>>> print L[-3]
Adam
>>> print L[-4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
L[-4]
報錯了,因為倒數(shù)第四不存在定铜,一共只有3個元素阳液。
使用倒序索引時,也要注意不要越界揣炕!不要越界帘皿!不要越界!重要的事情說三遍畸陡。
4.Python之添加新元素
現(xiàn)在鹰溜,班里有3名同學(xué):
>>> L = ['Adam', 'Lisa', 'Bart']
今天,班里轉(zhuǎn)來一名新同學(xué) Paul丁恭,如何把新同學(xué)添加到現(xiàn)有的 list
中呢曹动?
第一個辦法是用 list
的 append()
方法,把新同學(xué)追加到 list
的末尾:
>>> L = ['Adam', 'Lisa', 'Bart']
>>> L.append('Paul')
>>> print L
['Adam', 'Lisa', 'Bart', 'Paul']
append()
總是把新的元素添加到 list
的尾部牲览。
如果 Paul 同學(xué)表示自己總是考滿分墓陈,要求添加到第一的位置,怎么辦第献?
方法是用list
的 insert()
方法贡必,它接受兩個參數(shù),第一個參數(shù)是索引號庸毫,第二個參數(shù)是待添加的新元素:
>>> L = ['Adam', 'Lisa', 'Bart']
>>> L.insert(0, 'Paul')
>>> print L
['Paul', 'Adam', 'Lisa', 'Bart']
L.insert(0, 'Paul')
的意思是仔拟,'Paul'
將被添加到索引為 0
的位置上(也就是第一個),而原來索引為 0
的Adam
同學(xué)岔绸,以及后面的所有同學(xué)理逊,都自動向后移動一位。
5.Python從list刪除元素
Paul同學(xué)剛來幾天又要轉(zhuǎn)走了盒揉,那么我們怎么把Paul 從現(xiàn)有的list
中刪除呢晋被?
如果Paul同學(xué)排在最后一個,我們可以用list
的pop()
方法刪除:
>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
>>> L.pop()
'Paul'
>>> print L
['Adam', 'Lisa', 'Bart']
pop()
方法總是刪掉list
的最后一個元素刚盈,并且它還返回這個元素羡洛,所以我們執(zhí)行 L.pop()
后,會打印出 'Paul'
藕漱。
如果Paul同學(xué)不是排在最后一個怎么辦欲侮?比如Paul同學(xué)排在第三:
>>> L = ['Adam', 'Lisa', 'Paul', 'Bart']
要把Paul踢出list
,我們就必須先定位Paul的位置肋联。由于Paul的索引是2威蕉,因此,用 pop(2)
把Paul刪掉:
>>> L.pop(2)
'Paul'
>>> print L
['Adam', 'Lisa', 'Bart']
6.Python中替換元素
假設(shè)現(xiàn)在班里仍然是3名同學(xué):
>>> L = ['Adam', 'Lisa', 'Bart']
現(xiàn)在橄仍,Bart同學(xué)要轉(zhuǎn)學(xué)走了韧涨,碰巧來了一個Paul同學(xué),要更新班級成員名單侮繁,我們可以先把Bart刪掉虑粥,再把Paul添加進(jìn)來。
另一個辦法是直接用Paul把Bart給替換掉:
>>> L[2] = 'Paul'
>>> print L
L = ['Adam', 'Lisa', 'Paul']
對list
中的某一個索引賦值宪哩,就可以直接用新的元素替換掉原來的元素娩贷,list包含的元素個數(shù)保持不變。
由于Bart還可以用-1
做索引锁孟,因此彬祖,下面的代碼也可以完成同樣的替換工作:
>>> L[-1] = 'Paul'
7.Python之創(chuàng)建tuple
tuple
是另一種有序的列表,中文翻譯為“ 元組 ”品抽。tuple
和 list
非常類似涧至,但是,tuple
一旦創(chuàng)建完畢桑包,就不能修改了南蓬。
同樣是表示班里同學(xué)的名稱,用tuple
表示如下:
>>> t = ('Adam', 'Lisa', 'Bart')
創(chuàng)建tuple
和創(chuàng)建list唯一不同之處是用( )
替代了[ ]
哑了。
現(xiàn)在赘方,這個 t
就不能改變了,tuple
沒有 append()
方法弱左,也沒有insert()
和pop()
方法窄陡。所以,新同學(xué)沒法直接往 tuple
中添加拆火,老同學(xué)想退出 tuple
也不行跳夭。
獲取 tuple
元素的方式和 list
是一模一樣的涂圆,我們可以正常使用 t[0]
,t[-1]
等索引方式訪問元素币叹,但是不能賦值成別的元素润歉,不信可以試試:
>>> t[0] = 'Paul'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
8.Python之創(chuàng)建單元素tuple
tuple
和list
一樣,可以包含 0
個颈抚、1
個和任意多個元素踩衩。
包含多個元素的 tuple
,前面我們已經(jīng)創(chuàng)建過了贩汉。
包含 0
個元素的 tuple
驱富,也就是空tuple
,直接用 ()
表示:
>>> t = ()
>>> print t
()
創(chuàng)建包含1個元素的 tuple
呢匹舞?來試試:
>>> t = (1)
>>> print t
1
好像哪里不對褐鸥!t
不是 tuple
,而是整數(shù)1
赐稽。為什么呢晶疼?
因為()
既可以表示tuple
,又可以作為括號表示運算時的優(yōu)先級又憨,結(jié)果 (1)
被Python解釋器計算出結(jié)果 1
翠霍,導(dǎo)致我們得到的不是tuple
,而是整數(shù)1
蠢莺。
正是因為用()
定義單元素的tuple
有歧義寒匙,所以 Python 規(guī)定,單元素 tuple
要多加一個逗號“,”
躏将,這樣就避免了歧義:
>>> t = (1,)
>>> print t
(1,)
Python在打印單元素tuple
時锄弱,也自動添加了一個“,”
,為了更明確地告訴你這是一個tuple
祸憋。
多元素 tuple
加不加這個額外的“,”效果是一樣的:
>>> t = (1, 2, 3,)
>>> print t
(1, 2, 3)
9.Python之“可變”的tuple
前面我們看到了tuple
一旦創(chuàng)建就不能修改』嵯埽現(xiàn)在,我們來看一個“可變”的tuple
:
>>> t = ('a', 'b', ['A', 'B'])
注意到 t
有 3 個元素:**'a'蚯窥,'b'**
和一個list:**['A', 'B']**
掸鹅。list
作為一個整體是tuple
的第3個元素。list
對象可以通過 t[2]
拿到:
>>> L = t[2]
然后拦赠,我們把list
的兩個元素改一改:
>>> L[0] = 'X'>>> L[1] = 'Y'
再看看tuple的內(nèi)容:
>>> print t('a', 'b', ['X', 'Y'])
不是說tuple
一旦定義后就不可變了嗎巍沙?怎么現(xiàn)在又變了?
別急荷鼠,我們先看看定義的時候tuple
包含的3個元素:
當(dāng)我們把list的元素
'A'
和'B'
修改為'X'
和'Y'
后句携,tuple
變?yōu)椋?br>
表面上看,
tuple
的元素確實變了允乐,但其實變的不是 tuple
的元素矮嫉,而是list
的元素削咆。tuple一開始指向的
list
并沒有改成別的list
,所以蠢笋,tuple
所謂的“不變”是說拨齐,tuple的每個元素,指向永遠(yuǎn)不變挺尿。即指向'a'
奏黑,就不能改成指向'b'
炊邦,指向一個list
编矾,就不能改成指向其他對象,但指向的這個list
本身是可變的馁害!理解了“指向不變”后窄俏,要創(chuàng)建一個內(nèi)容也不變的
tuple
怎么做?那就必須保證tuple
的每一個元素本身也不能變碘菜。