官术网_书友最值得收藏!

3.1 容器類型

第2章我們介紹了Python中的基本數(shù)據(jù)類型,分別是整型、浮點型、字符串型以及布爾類型。在了解了基本數(shù)據(jù)類型后,我們便可以編寫簡單的Python代碼,但想實現(xiàn)復(fù)雜的邏輯還是會稍顯吃力。本節(jié)我們學(xué)習(xí)Python中的容器類型數(shù)據(jù)結(jié)構(gòu),它能讓讀者在編寫復(fù)雜程序時更加游刃有余。

3.1.1 列表

列表(list)是一種有序容器,可以向其中添加或刪除任意元素。在Python中,我們可以使用list方法創(chuàng)建一個空列表,也可以使用一對中括號來創(chuàng)建列表。因為中括號寫起來更簡便,所以通過中括號創(chuàng)建列表更為常見。示例代碼如下:

img

列表數(shù)據(jù)類型是一種容器類型,列表中可以存放不同數(shù)據(jù)類型的值。上述代碼中,l3列表中就存放了整型、浮點型、字符串型以及布爾類型的值。

容器類型變量中可以存放另一個容器類型變量,如列表中存放列表:

img

Python中提供了多種方法供我們輕松操作列表,并實現(xiàn)列表中元素的增、刪、改、查。下面簡單介紹列表的常用方法。

通過append方法可以向列表中添加元素,代碼如下:

img

在Python中,append方法可以將任意元素添加到列表中,以此作為列表中的“一個”元素。注意,append方法不能一次性地向列表中添加多個元素。

一個有趣的想法是,我們通過append方法添加列表后,會產(chǎn)生什么結(jié)果?示例代碼如下:

img

答案是會產(chǎn)生一個無限層的列表,這種列表通常沒有實際作用。

除append方法外,我們還可以通過extend方法向列表中添加元素。extend方法只接收列表類型的值作為參數(shù),該方法會將參數(shù)列表中的元素“拼接”到原始列表的尾部。示例代碼如下:

img

現(xiàn)在,我們知道通過append方法與extend方法可以向列表中添加元素,那么如何獲取列表中的元素呢?列表中的元素可以通過對應(yīng)的下標獲取,下標的起始值為0,代碼如下:

img

下標可以是正數(shù),也可以是負數(shù),列表中的最后一個元素可以通過-1獲取,倒數(shù)第二個元素可以通過-2獲取,依此類推。示例代碼如下:

img

除單純使用下標獲取單個元素外,我們還可以使用切片獲取一部分元素。切片通過中括號括起,在中括號中填寫開始下標與結(jié)束下標,兩個下標間通過冒號分割。使用切片獲取的元素會包含開始下標對應(yīng)的元素,但不會包含結(jié)束下標對應(yīng)的元素。示例代碼如下:

img

上述代碼使用切片獲取了a列表中的一部分元素,下標1對應(yīng)著a列表中的2,下標5對應(yīng)著a列表中的6。因為切片返回的數(shù)據(jù)會包含開始下標對應(yīng)的元素,但不會包含結(jié)束下標對應(yīng)的元素,所以結(jié)果為[2,3,4,5]。

除可以獲取元素外,下標還可以作為修改與刪除列表元素的基本操作。示例代碼如下:

img

上述代碼展示了修改與刪除列表中元素的操作。如果要修改列表中的元素,只需將新的值賦給列表中對應(yīng)下標的元素即可,而刪除列表中的元素可以使用兩種不同的方式。第一種是通過del關(guān)鍵字直接刪除列表中對應(yīng)下標元素的值,第二種是通過remove方法實現(xiàn)刪除效果。如果不知道要刪除的元素在列表中的下標,使用remove方法更加簡單,但remove方法只會刪除列表中與要刪除值匹配的第一個元素。

在很多情況下,我們需要對列表中的元素進行排序,此時可以使用sort方法實現(xiàn)排序效果。示例代碼如下:

img

如果需要對列表中的每個元素都進行操作,則可以使用for循環(huán)。例如,判斷列表中的元素是否為偶數(shù),如果為偶數(shù),則將其添加到新的列表中,代碼如下:

img

3.1.2 元組

元組(tuple)同樣是一種有序集合,它與列表非常相似,都可以通過下標、切片等方法取值;但與列表不同的是,元組一旦被初始化便不可修改其中的元素。在Python中,可以通過tuple方法或小括號的形式定義元組,因為元組元素具有不可變更的特性,所以元組在初始化時便會傳入對應(yīng)的值。示例代碼如下:

img

元組中的元素?zé)o法修改,如果強行修改會拋出錯誤。示例代碼如下:

img

報錯信息表明,tuple對象不支持修改,但有時會出現(xiàn)讓人困惑的代碼,如下:

img

上述代碼創(chuàng)建了t1與t2兩個元組,將兩個元組相加后,再賦值給t1,t1元組的內(nèi)容發(fā)生了變化,為何會如此?

其實,原本的t1元組并沒有發(fā)生變化,而是創(chuàng)建了新的t1元組,所以從最終效果上看,像是修改了t1元組本身。使用id方法可以獲取對象的唯一標識,通過唯一標識則可以判斷出不同的變量是否指向相同的對象。示例代碼如下:

img

回顧2.1.1節(jié),變量只是一張“便利貼”,便利貼貼在了具體的值上。在上述代碼中,變量t1在一開始貼在了元組(1,2,3,4)上,經(jīng)過累加操作后,變量t1貼在了新的元組上,而原本的元組(1,2,3,4)依舊存在且沒有改變。

與列表相似,可以通過下標或切片的方法獲取元組的值。示例代碼如下:

img

因為元組不可改變的特性,所以元組對象沒有提供修改、增加、刪除等方法。

元組是容器類型對象,容器類型對象可以存放容器類型對象本身,那么元組中是否可以存放列表呢?當然可以,使用元組存放列表會出現(xiàn)一些有趣的現(xiàn)象,代碼如下:

img

上述代碼創(chuàng)建了元組t,元組t的第3個元素是一個列表。元組中的元素是不可修改的,但上述代碼似乎對元組元素進行了修改,而且還修改成功了。

其實元組中的元素并沒有被修改,修改的是元組列表中的元素,如圖3.1所示。元組t中第3個元素為列表,列表中的元素是可以修改的,但元組依舊指向原本的列表,所以元組中的元素并沒有改變。

img

圖3.1

3.1.3 字典

字典(dict)是一種由鍵值對(key-value)構(gòu)成的數(shù)據(jù)結(jié)構(gòu),其中鍵與值通過冒號分割,我們通過鍵可以快速查找到對應(yīng)的值。在Python中,我們可以通過dict方法或花括號來構(gòu)建字典。示例代碼如下:

img

字典數(shù)據(jù)類型沒有下標的概念,只可以通過鍵值獲取字典中對應(yīng)的值。字典的使用方法與列表類似,不同之處在于列表使用中括號填寫的是列表下標,而字典使用中括號填寫的是字典中的鍵值。示例代碼如下:

img

向字典中添加新的元素或修改已存在的元素都需要通過鍵值來完成。例如,如果想修改字典中元素的值,那么需要先通過鍵值定位元素,再直接將新的值賦給該元素,代碼如下:

img

刪除字典中的某個元素可以使用del方法,但如果想要清空整個字典,則需要使用clear方法。示例代碼如下:

img

清空字典的另一種方法是直接將空字典賦值給當前字典變量,與clear方法不同,原本字典中的值其實沒有被刪除,我們只是將字典變量“便利貼”貼到了新的字典對象上,通過id方法可以看出兩者不同。示例代碼如下:

img

字典獲取數(shù)據(jù)依賴于鍵值,這要求字典中的鍵值不可重復(fù)以及不可變。不可重復(fù)很好理解,一個字典中不會存在多個相同的鍵值,如果存在,那么使用最新的鍵值。示例代碼如下:

img

不可變的含義不太好理解,回顧3.1.2節(jié)中元組相關(guān)內(nèi)容,元組就是不可變對象,而列表是可變對象。不可變?nèi)缱置婧x,對象的內(nèi)容不可被改變,其中整型、浮點型、字符串型以及元組型都是不可變類型,都可以作為字典的鍵。

字典中的每個元素都具有鍵與值,通過for循環(huán)遍歷字典時,默認只會獲取字典元素中的鍵;如果想要獲取鍵與值,則需要使用items方法。示例代碼如下:

img

我們可以結(jié)合字典與列表構(gòu)成更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)更復(fù)雜的代碼。例如,有一個字典d,具體的值為{'a':1,'b':1,'c':3,'d':4,'e':3,'f':1,'g':4},是否可以將具有相同值的鍵整理出來?代碼如下:

img

在上述代碼中,一開始定義了一個新的字典new_d,然后通過for循環(huán)遍歷字典中的鍵與值,接著調(diào)用setdefault方法,該方法會返回某個鍵對應(yīng)的值,如果當前字典中不存在這個鍵,則會將默認值作為該鍵對應(yīng)的值并返回默認值。setdefault方法接收兩個參數(shù),第一個參數(shù)為鍵,第二個參數(shù)為默認值。

上述代碼中,setdefault方法的具體使用方式為new_d.setdefault(v,[]),這表示先從new_d字典中獲取鍵值為v的值,如果new_d字典中不存在該鍵,則將空列表設(shè)置為該鍵對應(yīng)的值并返回空列表。

因為setdefault方法會返回列表,所以在該方法后,append方法緊接著將對應(yīng)的值添加到相應(yīng)的列表中,最終將字典d中具有相同值的鍵整合在了一起。

默認的字典是無序的,如果希望創(chuàng)建有序字典,則可以使用collections庫(Python內(nèi)置庫)下的OrderedDict類創(chuàng)建有序字典。示例代碼如下:

img

通過OrderedDict類創(chuàng)建的有序字典存放的元素是具有順序的,其余功能與普通字典類似。OrderedDict類其實也是基于dict類實現(xiàn)的,這種方法被稱為繼承,關(guān)于繼承的相關(guān)內(nèi)容可以閱讀3.3.2節(jié)。

3.1.4 集合

集合(set)具有如下兩個重要特性。

(1)集合中的元素沒有順序。

(2)集合中不存在重復(fù)元素。

集合元素的無序性讓集合無法像列表那樣通過下標去獲取對應(yīng)的值,集合元素不可重復(fù)的特性可以讓集合用于去除重復(fù)值的場景。

在Python中,可以通過set方法或花括號來創(chuàng)建集合,字典也是使用花括號創(chuàng)建的,但與字典不同,集合中的元素沒有鍵與值的概念。此外,我們只可通過set方法創(chuàng)建空集合,因為使用空花括號會創(chuàng)建字典對象。

Python中提供了多種方法可以輕松操作集合,實現(xiàn)集合中元素的增、刪、改、查。下面我們簡單介紹這些方法。

首先,集合可以通過add或update方法添加元素,代碼如下:

img

其次,還可以通過remove或discard方法刪除集合中的元素。如果使用remove方法刪除集合中不存在的元素,Python會拋出錯誤,因為remove方法只能刪除存在于集合中的元素;而discard方法則不同,即使要刪除的元素不存在于集合中,也不會發(fā)生錯誤。示例代碼如下:

img

因為集合具有元素不可重復(fù)的特性,所以常用集合處理去重任務(wù)。例如,要去除列表中重復(fù)的元素,此時就可以先將列表轉(zhuǎn)為集合后再轉(zhuǎn)為列表,代碼如下:

img

與其他容器類型的數(shù)據(jù)結(jié)構(gòu)不同,集合除支持上述基本操作外,還支持集合間運算。

通過“&”運算符可以計算出兩個集合的交集,代碼如下:

img

類似地,通過“-”運算符可以計算出兩個集合的差集,通過“|”運算符可以計算出兩個集合的并集,通過“^”運算符可以計算出兩個集合的對稱差集。示例代碼如下:

img
主站蜘蛛池模板: 邛崃市| 西华县| 开江县| 平顶山市| 余庆县| 成安县| 龙海市| 老河口市| 黄陵县| 台东市| 且末县| 台北县| 精河县| 永胜县| 洛川县| 揭阳市| 东山县| 永善县| 十堰市| 宁化县| 五河县| 凭祥市| 阿拉善右旗| 漠河县| 凉城县| 赤水市| 平湖市| 越西县| 衢州市| 蓝田县| 青海省| 云霄县| 沐川县| 龙游县| 鄯善县| 玉山县| 高台县| 克什克腾旗| 邻水| 巴青县| 普洱|