- Python自動化辦公:3分鐘完成一天工作
- 廖茂文
- 3653字
- 2021-07-23 18:52:11
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)建列表更為常見。示例代碼如下:

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

Python中提供了多種方法供我們輕松操作列表,并實現(xiàn)列表中元素的增、刪、改、查。下面簡單介紹列表的常用方法。
通過append方法可以向列表中添加元素,代碼如下:

在Python中,append方法可以將任意元素添加到列表中,以此作為列表中的“一個”元素。注意,append方法不能一次性地向列表中添加多個元素。
一個有趣的想法是,我們通過append方法添加列表后,會產(chǎn)生什么結(jié)果?示例代碼如下:

答案是會產(chǎn)生一個無限層的列表,這種列表通常沒有實際作用。
除append方法外,我們還可以通過extend方法向列表中添加元素。extend方法只接收列表類型的值作為參數(shù),該方法會將參數(shù)列表中的元素“拼接”到原始列表的尾部。示例代碼如下:

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

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

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

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

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

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

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

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

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

上述代碼創(chuàng)建了t1與t2兩個元組,將兩個元組相加后,再賦值給t1,t1元組的內(nèi)容發(fā)生了變化,為何會如此?
其實,原本的t1元組并沒有發(fā)生變化,而是創(chuàng)建了新的t1元組,所以從最終效果上看,像是修改了t1元組本身。使用id方法可以獲取對象的唯一標識,通過唯一標識則可以判斷出不同的變量是否指向相同的對象。示例代碼如下:

回顧2.1.1節(jié),變量只是一張“便利貼”,便利貼貼在了具體的值上。在上述代碼中,變量t1在一開始貼在了元組(1,2,3,4)上,經(jīng)過累加操作后,變量t1貼在了新的元組上,而原本的元組(1,2,3,4)依舊存在且沒有改變。
與列表相似,可以通過下標或切片的方法獲取元組的值。示例代碼如下:

因為元組不可改變的特性,所以元組對象沒有提供修改、增加、刪除等方法。
元組是容器類型對象,容器類型對象可以存放容器類型對象本身,那么元組中是否可以存放列表呢?當然可以,使用元組存放列表會出現(xiàn)一些有趣的現(xiàn)象,代碼如下:

上述代碼創(chuàng)建了元組t,元組t的第3個元素是一個列表。元組中的元素是不可修改的,但上述代碼似乎對元組元素進行了修改,而且還修改成功了。
其實元組中的元素并沒有被修改,修改的是元組列表中的元素,如圖3.1所示。元組t中第3個元素為列表,列表中的元素是可以修改的,但元組依舊指向原本的列表,所以元組中的元素并沒有改變。

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

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

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

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

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

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

不可變的含義不太好理解,回顧3.1.2節(jié)中元組相關(guān)內(nèi)容,元組就是不可變對象,而列表是可變對象。不可變?nèi)缱置婧x,對象的內(nèi)容不可被改變,其中整型、浮點型、字符串型以及元組型都是不可變類型,都可以作為字典的鍵。
字典中的每個元素都具有鍵與值,通過for循環(huán)遍歷字典時,默認只會獲取字典元素中的鍵;如果想要獲取鍵與值,則需要使用items方法。示例代碼如下:

我們可以結(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},是否可以將具有相同值的鍵整理出來?代碼如下:

在上述代碼中,一開始定義了一個新的字典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)建有序字典。示例代碼如下:

通過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方法添加元素,代碼如下:

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

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

與其他容器類型的數(shù)據(jù)結(jié)構(gòu)不同,集合除支持上述基本操作外,還支持集合間運算。
通過“&”運算符可以計算出兩個集合的交集,代碼如下:

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

- 軟件架構(gòu)設(shè)計:大型網(wǎng)站技術(shù)架構(gòu)與業(yè)務(wù)架構(gòu)融合之道
- Reactive Programming with Swift
- Java程序設(shè)計與計算思維
- Java項目實戰(zhàn)精編
- 焊接機器人系統(tǒng)操作、編程與維護
- HTML5 APP開發(fā)從入門到精通(微課精編版)
- 網(wǎng)絡(luò)數(shù)據(jù)采集技術(shù):Java網(wǎng)絡(luò)爬蟲實戰(zhàn)
- UX Design for Mobile
- Android 游戲開發(fā)大全(第二版)
- HTML5 WebSocket權(quán)威指南
- WCF編程(第2版)
- The Python Apprentice
- VBA Automation for Excel 2019 Cookbook
- 區(qū)塊鏈原理、設(shè)計與應(yīng)用
- 軟件定義存儲:原理、實踐與生態(tài)