Python常用的集合類型List和Tuple

Python最常用的兩種集合類型:listtuple文搂,我們可以用listtuple來表示有序集合。

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师倔,12周蹭。

所以趋艘,使用索引時,千萬注意不要越界凶朗!不要越界瓷胧!不要越界!重要的事情說三遍棚愤。搓萧。

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 中呢曹动?

第一個辦法是用 listappend() 方法,把新同學(xué)追加到 list 的末尾:

>>> L = ['Adam', 'Lisa', 'Bart']
>>> L.append('Paul')
>>> print L
['Adam', 'Lisa', 'Bart', 'Paul']

append()總是把新的元素添加到 list 的尾部牲览。

如果 Paul 同學(xué)表示自己總是考滿分墓陈,要求添加到第一的位置,怎么辦第献?

方法是用listinsert()方法贡必,它接受兩個參數(shù),第一個參數(shù)是索引號庸毫,第二個參數(shù)是待添加的新元素:

>>> L = ['Adam', 'Lisa', 'Bart']
>>> L.insert(0, 'Paul')
>>> print L
['Paul', 'Adam', 'Lisa', 'Bart']

L.insert(0, 'Paul') 的意思是仔拟,'Paul'將被添加到索引為 0 的位置上(也就是第一個),而原來索引為 0Adam同學(xué)岔绸,以及后面的所有同學(xué)理逊,都自動向后移動一位。

5.Python從list刪除元素

Paul同學(xué)剛來幾天又要轉(zhuǎn)走了盒揉,那么我們怎么把Paul 從現(xiàn)有的list中刪除呢晋被?

如果Paul同學(xué)排在最后一個,我們可以用listpop()方法刪除:

>>> 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是另一種有序的列表,中文翻譯為“ 元組 ”品抽。tuplelist 非常類似涧至,但是,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

tuplelist一樣,可以包含 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的每一個元素本身也不能變碘菜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凹蜈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子忍啸,更是在濱河造成了極大的恐慌仰坦,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件计雌,死亡現(xiàn)場離奇詭異悄晃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)凿滤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門妈橄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人翁脆,你說我怎么就攤上這事眷蚓。” “怎么了反番?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵沙热,是天一觀的道長。 經(jīng)常有香客問我罢缸,道長校读,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任祖能,我火速辦了婚禮歉秫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘养铸。我一直安慰自己雁芙,他們只是感情好轧膘,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兔甘,像睡著了一般谎碍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洞焙,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天蟆淀,我揣著相機(jī)與錄音,去河邊找鬼澡匪。 笑死熔任,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唁情。 我是一名探鬼主播疑苔,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼甸鸟!你這毒婦竟也來了惦费?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抢韭,失蹤者是張志新(化名)和其女友劉穎薪贫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刻恭,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡瞧省,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吠各。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臀突。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贾漏,靈堂內(nèi)的尸體忽然破棺而出候学,到底是詐尸還是另有隱情,我是刑警寧澤纵散,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布梳码,位于F島的核電站,受9級特大地震影響伍掀,放射性物質(zhì)發(fā)生泄漏掰茶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一蜜笤、第九天 我趴在偏房一處隱蔽的房頂上張望濒蒋。 院中可真熱鬧,春花似錦、人聲如沸沪伙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽围橡。三九已至暖混,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翁授,已是汗流浹背拣播。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留收擦,地道東北人贮配。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像炬守,于是被迫代替她去往敵國和親牧嫉。 傳聞我的和親對象是個殘疾皇子剂跟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 一减途、python 變量和數(shù)據(jù)類型 1.整數(shù) Python可以處理任意大小的整數(shù),當(dāng)然包括負(fù)整數(shù)曹洽,在Python程序...
    績重KF閱讀 1,714評論 0 1
  • 最近在慕課網(wǎng)學(xué)習(xí)廖雪峰老師的Python進(jìn)階課程鳍置,做筆記總結(jié)一下重點。 基本變量及其類型 變量 在Python中送淆,...
    victorsungo閱讀 1,701評論 0 5
  • 01 Python 創(chuàng)建list Python 內(nèi)置的一種數(shù)據(jù)結(jié)構(gòu)類型是列表:list 税产!list 是一種有序的集...
    AlvinMi閱讀 305評論 0 0
  • 什么是dict 我們已經(jīng)知道,list 和 tuple 可以用來表示順序集合偷崩,例如辟拷,班里同學(xué)的名字: ['Adam...
    _王子_閱讀 1,285評論 0 1
  • List Python內(nèi)置的一種數(shù)據(jù)類型是列表:list。list是一種有序的集合阐斜,可以隨時添加和刪除其中的元素衫冻。...
    _王子_閱讀 627評論 0 1