Python四種重要數(shù)據(jù)結(jié)構(gòu)的深入學(xué)習(xí)(1)

作者:王曄 ?????時(shí)間:2019.5.17 19:00

列表和元組

列表(list)和元組(tuple)十分地相似,他們都是可以放任意數(shù)據(jù)類型的有序集合,并且都支持索引切片 操作。但是既然是兩種不同的數(shù)據(jù)結(jié)構(gòu),他們必然會(huì)有不同的地方。
在我們?nèi)粘W(xué)習(xí)中,一個(gè)很明顯的區(qū)別就是:

  • 列表是動(dòng)態(tài)的,長(zhǎng)度大小不固定,可以隨意地增加、刪減或者改變?cè)兀╩utable)
  • 元組是靜態(tài)的,長(zhǎng)度大小固定,無法增加刪減或者改變(immutable)
>>> list = [1, 2, 3, 4]
>>> tuple = (1, 2, 3, 4)
>>> 
>>> list.append(5)
>>> list
[1, 2, 3, 4, 5]
>>> tuple.append(5)
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    tuple.append(5)
AttributeError: 'tuple' object has no attribute 'append'
>>> list[3]
4
>>> tuple[3]
4
>>> tuple[3]=40
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    tuple[3]=40
TypeError: 'tuple' object does not support item assignment
>>> list[3]=40
>>> list[3]
40

所以如果我們想對(duì)元組進(jìn)行改變,就只能重新開辟一塊內(nèi)存,即創(chuàng)建一個(gè)新的元組。

>>> tuple = (1, 2, 3, 4)
>>> new_tuple = tuple + (5,)
>>> new_tuple
(1, 2, 3, 4, 5)
  • Python的列表和元組都支持負(fù)數(shù)索引,-1表示最后一個(gè)元素。

  • 并且他們都支持嵌套操作:

>>> list=[[1,2,3],[4,5,6]]
>>> tuple = ((1,2,3),(4,5,6))
  • 還支持相互轉(zhuǎn)換,且返回值為新的列表/元組,不改變?cè)袛?shù)據(jù)結(jié)構(gòu)
>>> ls = [1, 2, 3]
>>> tp = (1, 2, 3)
>>> list(tp)
[1, 2, 3]
>>> tuple(ls)
(1, 2, 3)
>>> tp
(1, 2, 3)
>>> ls
[1, 2, 3]
  • 列表和元組常用重要的內(nèi)置函數(shù):
>>> l = [3, 2, 3, 7, 8, 1]
>>> l.count(3) 
2
>>> l.index(7)
3
>>> l.reverse()
>>> l
[1, 8, 7, 3, 2, 3]
>>> l.sort()
>>> l
[1, 2, 3, 3, 7, 8]
>>> tup = (3, 2, 3, 7, 8, 1)
>>> tup.count(3)
2
>>> tup.index(7)
3
>>> list(reversed(tup))
[1, 8, 7, 3, 2, 3]
>>> sorted(tup)
[1, 2, 3, 3, 7, 8]

count(item)用于統(tǒng)計(jì)item出現(xiàn)的次數(shù)
index(item)用于返回第一次出現(xiàn)item的索引
sort(key=None, reverse=False)用于對(duì)元素進(jìn)行排序,后面?zhèn)魅氲膮?shù),一個(gè)是比較元素,一個(gè)是排序規(guī)則,默認(rèn)為False升序,具體見:List sort()方法
reverse()方法可以將所有元素反向
當(dāng)然還有append(item)(在列表末尾添加新的對(duì)象)、extend()(在列表末尾一次性追加另一個(gè)序列中的多個(gè)值(用新列表擴(kuò)展原來的列表))、remove(item)(移除列表中某個(gè)值的第一個(gè)匹配項(xiàng))、insert(index,item)(從列表中找出某個(gè)值第一個(gè)匹配項(xiàng)的索引位置)、pop([index=-1])(移除列表中的一個(gè)元素(默認(rèn)最后一個(gè)元素),并且返回該元素的值)等等,請(qǐng)參考Python3 列表Python3 元組,我就不一一贅述了。

  • 較為重要的是兩者之間的儲(chǔ)存差異
    我們先來看他們的儲(chǔ)存:
>>> list = [1, 2, 3]
>>> list.__sizeof__()
64
>>> tuple = (1, 2, 3)
>>> tuple.__sizeof__()
48

可以看出來他們?cè)趦?chǔ)存相同元素的時(shí)候所占的儲(chǔ)存空間也不一樣,元組的儲(chǔ)存空間要比列表的儲(chǔ)存空間,也就是同等條件下使用元組性能更優(yōu)。

原因有以下幾個(gè):

  • 由于列表是動(dòng)態(tài)的,它能改變長(zhǎng)度,需要開辟內(nèi)存存放指針
  • 由于列表的空間是不定的,里面有一定的空間增長(zhǎng)算法,來分配額外的空間(over-allocating),可以保證順利的增減數(shù)據(jù)(有利于降低時(shí)間復(fù)雜度,提高效率)

所以我們?cè)趯?shí)際生產(chǎn)生活中,如果我們需要存儲(chǔ)的數(shù)據(jù)是固定不變的,或者返回定長(zhǎng)的數(shù)據(jù),使用元組則效率更加快,當(dāng)然如果數(shù)據(jù)需要不斷地更改的時(shí)候,列表就更為合適。

想要繼續(xù)探究的,可以參考Python的源碼:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容