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

3.4 列表

列表(list)是Python的一個內置對象(或者對象類型),它具有強大的功能。在開始學習之前,先牢記一句順口溜:列表是個筐,什么都能裝。然后由淺入深、按部就班地研習這個“筐”的作用。

3.4.1 創建列表

Python中的列表可以用[]表示,它不像數字、字符串那樣直接與自然語言中的內容對應,而是完全人為定義的對象類型。

img

用list表示列表對象,注意在上述操作中,使用的是lst這個變量引用了一個空列表對象,變量名稱沒有使用list,因為list 用來表示了列表對象(或列表對象類型)——變量的名稱要盡可能不與類型名稱重復。

定義空列表的方法還可以是這樣的:

img

其實,對于數字和字符串而言,也可以有“空”數字、“空”字符串,雖然在自然語言中不需要這樣,但在Python這種人工語言中是符合語法規則的。

img

列表也是一個容器——“一個筐”,這個容器中可以放的東西稱為列表的元素。列表的元素可以是任何類型的Python對象——“什么都能裝”。

img

在a_lst這個列表中,其元素包括數字、字符串、空列表和非空列表。其實還可以包括后續要學習的任何Python對象,也包括自定義的對象類型(函數、類等)。隨著學習的深入,讀者會逐漸理解。

有一種“列表套列表”的情況:

img

類似這樣的列表被稱為“多維列表”(此處是二維),類似數學中的矩陣。當然,可以做更多層的嵌套。

img

而且,列表中的元素可以重復,列表中的元素也對位置敏感。lst1與lst2相比,元素1和2的排序變化了,它們是兩個不同列表。這與字符串類似,列表和字符串一樣,都是“序列”。通過dir(list)查看列表的屬性和方法,與字符串的屬性和方法對比,會發現它們有相同的方法,如index(),而且作用一樣。也就是說,列表同樣有索引,可以進行切片操作。

【例題3-4-1】 有一種矩陣被稱為單位矩陣,它是個方陣,從左上角到右下角的對角線上的元素均為1,除此以外全都為0。用列表表示一個3×3的單位矩陣。

代碼示例

img

二維列表可以用來表示矩陣,第一個元素表示矩陣的第一行,以此類推。

3.4.2 索引和切片

列表既然是序列,也就跟字符串一樣,其中的每個元素都有索引,而且索引的建立方式與字符串中所學習過的也一樣。讀者可以在交互環境中調試下面的各項操作,并回憶字符串中索引的特點。

img

如果從左邊開始對各元素的索引編號,也是從0開始計數;如果從右邊開始編號,也是從-1開始計數。這些都與字符串中的索引方式相同。

對列表進行切片的基本方法與字符串中的方法也是一致的。字符串中表示切片的公式在列表中依然適用,只不過對象換成列表罷了。

img

請讀者進入到Python交互模式,按照下面的示例,練習列表的切片操作。

img

經過了這些切片操作后,再查看原來的列表:

img

原來的列表并沒有因為上述操作而變化,這說明每次切片都是新建了對象,不對原列表進行修改。這種特點與字符串依然相同。

以上演示的是“一維列表”的索引和切片操作,在3.4.1節中定義過一個“二維列表”,那么它里面的元素如何獲取?

img

就索引和切片的基本方法,列表和字符串沒有區別。但列表也有獨到之處。

img

①是通過索引修改元素對象,原來lst[0]是字符串(“a”),經過①之后,該位置變成了新的對象。這種操作在字符串中是不能進行的。

img

這顯示了列表和字符串的最大區別:列表創建后,可以進行修改,而字符串不能修改。或者說,列表和字符串都是序列,它們有相同的地方;但列表和字符串又是兩種類型的對象,它們必然存在不同。

【例題3-4-2】 有列表["a","b","c","d","e","f","g","h"],將列表翻轉,并把其中的元音字母“e”轉換為100。

代碼示例

img

3.4.3 列表的基本操作

在3.3.3 節中所述的各項操作是所有序列都具有的,列表也是一種序列,所以同樣可以實施其中的各項操作。

img
img

注意,以上操作都是新生成了一個列表,并沒有對原列表進行修改。

img

基本操作與字符串中的都一樣。兩者不同的地方在于前面提到的,列表是可變的,而字符串是不可變的。這點不同使得列表具有一些不同于字符串的方法。

3.4.4 列表的方法

在3.4.2節中提到過,可以根據索引修改列表的元素。比如:

img

這種操作可以看作列表可修改的例證。那么,能不能給列表隨時增加新的元素呢?比如對cities這個列表,是否可以用增加索引的方式增加元素?

img

操作結果說明,這種想法在這里是無法實現的。

對于任何可修改對象,一般都有“增”“刪”“改”的操作,“改”這種操作在前面已經實現了,其他兩項如何實現呢?

查看列表有哪些方法?還是使用前面已經多次提到過的dir函數。

img

在Python中,命名都是本著“望文生義”的原則。所以,讀者認真看一看列出來的各名稱,也能猜測到其大概功能。

1.增加列表的元素

與增加列表元素有關的方法包括append()、extend()、insert(),下面依次演示它們的使用方法。還是先老生常談,讀者一定要使用help函數查看并閱讀各方法的聯機幫助文檔。

img
img

這是已知列表cities的內存地址,append()方法是對列表從尾部(通常以列表的左端為開始,右端為尾部)追加一個元素。

img

追加元素后,請仔細觀察這時候內存地址的變化——沒變化。當給列表追加了元素后,列表的內存地址沒有改變,也就說明沒有生成新的列表,cities還是原來的列表。操作②還有一個特點也要引起關注,那就是沒有返回值,或者說返回值為None。

一個列表對象,其元素變化了,但列表對象的內存地址沒有改變,也就是沒有生成新的列表,這種現象可以被稱為“原地修改”。如果把列表看作一個容器,可以形象地理解為容器內的東西(object,對象)變化了,但是容器還是原來的容器。

列表的這種特性在其他方法中也有體現。

img

列表的insert()方法實現了在列表任何位置插入對象的操作,依然是原地修改。例如:

img

在cities列表中,最大索引是3,如果進行如下操作:

img

試圖將"ningbo"插入到索引是4的前面,但是沒有這個索引。換個說法,4前面就是3的后面,最終效果與追加相同。

如果讀者已經查看了append()和insert()兩個方法的幫助文檔,會發現它們向列表中增加的都是對象(object)——如果還沒有查看,請馬上動手。

下面要介紹的extend()方法,其參數要求傳入的對象必須是iterable——可迭代對象。前面章節中已經提到過這類對象了,到目前為止,字符串和列表都是可迭代的。

img
img

③的效果是將列表lst中的所有元素加入到cities中,即讓cities擴容。④將參數換成了另一個可迭代對象——字符串"py"。注意查看最終的效果,將字符串的元素(即每個字符)加入到cities列表中。

學程序一定要有好奇心,交互模式就是一個實驗室,可以在這個環境中快速檢驗自己的想法,哪怕是比較愚蠢的想法。

img

“失敗是成功之母”,每次遇到報錯信息,都要認真閱讀,就能不斷積累經驗。通過閱讀此處的報錯信息,讀者應該更加認識到傳入extend()方法的對象必須是可迭代的。

那么,如何判斷一個對象是不是可迭代的?下面演示一種方法(事實上還有其他方式):

img

這里用內建函數hasattr判斷一個字符串是否是可迭代的,返回了True。用同樣的方式可以判斷:

img

hasattr函數的判斷本質就是看類型中是否有__iter__()這個特殊方法。讀者可以用dir函數找一找,在數字、字符串、列表中,誰有__iter__()。

在③和④的操作中,對extend()方法提供的對象要求是“可迭代的”。除了這點,操作結果似乎與append()方法的結果一樣。

看下面的操作,進行深入比較。

img

認真觀察③和⑤的操作結果,可以理解append()與extend()方法的區別。

2.刪除列表的元素

列表提供的刪除元素的方法有兩個:remove()和pop()。幫助文檔顯示,兩個方法的調用方式分別是L.remove(x)、L.pop([index])。從參數中可以看出,這兩個方法分別提供了依據元素(x)和依據索引(index)進行刪除的方式。

img

請讀者自行考察,經過上述操作之后,列表cities是否為原地修改。

img

如果某個元素不存在于列表中,進行此操作是要報錯的。如何避免這個錯誤?最好提前進行判斷:要刪除的元素是否在列表中。

img

接著看另一個能夠刪除列表元素的方法——L.pop([index]),以[index]形式表示索引是可選的。

img

這里沒有提供任何參數,即pop()方法的參數列表為空,則刪除列表的最后一個元素,并且將刪除的元素作為結果返回。注意,它有返回值。

如果參數不為空,可以刪除指定索引的元素,并將該元素作為返回值。

img

對這兩個刪除方法簡要總結如下:

? L.remove(x)中的參數x是列表中的元素,即刪除某個元素,且對列表原地修改,無返回值。

? L.pop([index])中的index是列表中元素的索引值,可選。“為空”則刪除列表最后一個,否則刪除索引為index的元素,并且將刪除元素作為返回值。

除了remove()和pop(),列表中還有一個方法,名為clear(),它的作用是將列表中元素“清掃干凈”,只剩下一個空列表。

img
img

認真觀察上述操作,執行了列表的clear()方法后,當前列表變成了空列表。但是列表的內存地址沒有改變,“容器”中沒有任何東西,“容器”并沒有因此變化,還是原來的“容器”。

img

最終結果與前述操作結果看似一樣,都是最終得到了一個空列表。實質上,這里的temp變量先后引用了兩個不同的對象,對此處操作的理解就需要讀者使用3.2.4節中學習過的“變量”與“對象”關系的知識了。

3.列表元素的排序

字符串是序列,但是對組成它的字符進行排序,通常實際意義不是很大;列表則不然,組成它的元素固然有某個順序了,但是在實際應用中常常要將其按照某種順序重新排列。比如,由若干人的姓名組成的列表,通常需要將列表按照人名的某種順序排列(常見的按照字典中的拼音順序排列)。更何況,如果非要對字符串中的字符排序,可以把它轉化為列表。因為列表是可變的,這個特點為實現其排序提供了便利條件。

本著“望文生義”的原則,在列表的方法中可以看到sort(),就是用來對列表進行排序的方法。

img

sort()方法的結果是讓列表原地修改,沒有返回值。在默認情況下,如上面的操作,實現的是從小到大的排序。

img

在sort()中使用參數reverse=True,就實現了從大到小的排序。

如果讀者查看sort()方法的文檔,會發現它的完整格式中還有一個參數key。

img

key是什么意思呢?請看如下操作。

img

這樣實現了以字符串的長度為關鍵詞進行排序。

對于排序而言,Python中還提供了一個內置函數sorted。下面比較它與列表的方法sort()。

img

這里使用內置函數sorted對列表lst中的元素進行排序,因為這個列表中的元素是字符串,所以是按照字典順序排序的。從結果上看,用sorted函數排序后,得到了一個新的列表對象,原列表沒有變化。

img

如果使用列表的sort()方法進行排序,雖然結果一樣,但是列表lst被原地修改了。這是兩種排序方法的最大區別。

4.列表元素的反轉

在3.4.2節中已經有方法實現列表元素的反轉了。

img

除了這種反轉方法,列表還提供了一種反轉方法reverse,其調用方式比較簡單。

img

注意,依然是原地修改,它沒有返回值。

Python中也為反轉操作提供了內建函數reversed,兩者效果相當,但是也有區別。

img

使用reversed函數對列表a進行反轉,得到了一個新的對象,這個對象是一個“迭代器”對象,所以不能像列表那樣直觀地看到里面的內容。可以使用list函數將此對象轉換為列表。

img

其實,內置函數reversed的參數不僅可以是列表,還可以是任何其他序列,包括字符串。

img

以上介紹了列表中的常用方法,未盡內容,請讀者參考官方文檔。

【例題3-4-3】 將字符串"python"轉化為列表(記為lst),并將“rust”中的每個字符作為一個獨立元素追加到列表lst中,然后將重復的元素全部刪除。

代碼示例

img
主站蜘蛛池模板: 株洲县| 泽普县| 泌阳县| 班戈县| 盱眙县| 成武县| 连江县| 常山县| 苍山县| 建始县| 开化县| 新闻| 玉门市| 堆龙德庆县| 赞皇县| 辰溪县| 松阳县| 阳泉市| 浙江省| 萨迦县| 屯昌县| 永安市| 元阳县| 普陀区| 裕民县| 汝州市| 竹北市| 福安市| 兴和县| 舞钢市| 泸水县| 海盐县| 武陟县| 漾濞| 新泰市| 汉川市| 隆德县| 平阳县| 常熟市| 万源市| 景泰县|