您好,登錄后才能下訂單哦!
第3章
學習目標:
列表是什么以及如何使用列表元素。列表讓你能夠在一個地方存儲成組的信息,其中可以只包含幾個元素,也可以包含數(shù)百萬個元素。列表是新手可直接使用的最強大的Python功能之一,它融合了眾多重要的編程概念。
3.1 列表是什么
列表由一系列按特定順序排列的元素組成。你可以創(chuàng)建包含字母表中所有字母、數(shù)字0~9或
所有家庭成員姓名的列表;也可以將任何東西加入列表中,其中的元素之間可以沒有任何關(guān)系。
鑒于列表通常包含多個元素,給列表指定一個表示復數(shù)的名稱(如letters、digits或names)是
個不錯的主意。
在Python中,用中括號 [] 表示列表,并用逗號來分隔其中的元素。
例如:
bicycles.py
bicycles = [ 'trek','cannondale','redline','specialired' ]
print(bicycles)
# 結(jié)果:
['trek', 'cannondale', 'redline', 'specialired']
3.1.1 訪問列表元素
列表是有序集合,因此要訪問列表的任何元素,只需將該元素的位置或索引告訴Python即可。
要訪問列表元素,可指出列表的名稱,再指出元素的索引,并將其放在方括號內(nèi)。
# 例如,從列表bicycles中提取第一款自行車
bicycles = [ 'trek','cannondale','redline','specialired' ]
print(bicycles[0])
# 結(jié)果:
trek
# 當然,或者 可使用方法title()讓元素 'trek'的格式更整潔:
print(bicycles[0].title())
# 這個示例的輸出與前一個示例相同,只是首字母T是大寫的。
3.1.2 檢索從0而不是1開始
在Python中,第一個列表元素的索引為0,而不是1。在大多數(shù)編程語言中都是如此,這與列
表操作的底層實現(xiàn)相關(guān)。
print(bicycles[1])
print(bicycles[3])
# 這些代碼返回列表中得第二個和第四個元素:
cannondale
specialized
# Python為訪問最后一個列表元素提供了一種特殊語法。通過將索引指定為-1,可讓Python返
回最后一個列表元素:
print(bicycles[-1])
這些代碼返回'specialized'。這種語法很有用,因為你經(jīng)常需要在不知道列表長度的情況
下訪問最后的元素。這種約定也適用于其他負數(shù)索引,例如,索引-2返回倒數(shù)第二個列表元素,
索引-3返回倒數(shù)第三個列表元素,以此類推。
3.1.3 使用列表中的各個值
可像使用其他變量一樣使用列表中的各個值。例如,你可以使用拼接根據(jù)列表中的值來創(chuàng)建
消息。
下面來嘗試從列表中提取第一款自行車,并使用這個值來創(chuàng)建一條消息:
message = "My first bicycle was a " + bicycles[0].title() + "."
print(message)
# 結(jié)果:
My first bicycle was a Trek.
請嘗試編寫一些簡短的程序來完成下面的練習,以獲得一些使用Python 列表的第
一手經(jīng)驗。你可能需要為每章的練習創(chuàng)建一個文件夾,以整潔有序的方式存儲為完成各
章的練習而編寫的程序。
3-1 姓名:將一些朋友的姓名存儲在一個列表中,并將其命名為names。依次訪問
該列表中的每個元素,從而將每個朋友的姓名都打印出來。
names = [ 'zhangsan','lisi','wangwu','zhaoliu']
print(names[0])
print(names[1])
print(names[-2])
print(names[-1])
# 結(jié)果:
zhangsan
lisi
wangwu
zhaoliu
3-2 問候語:繼續(xù)使用練習3-1 中的列表,但不打印每個朋友的姓名,而為每人打
印一條消息。每條消息都包含相同的問候語,但抬頭為相應朋友的姓名。
messname1 = "Hi " + names[0].title() + "."
messname2 = "Hi " + names[1].title() + "."
messname3 = "Hi " + names[2].title() + "."
messname4 = "Hi " + names[3].title() + "."
print(messname1)
print(messname2)
print(messname3)
print(messname4)
# 結(jié)果:
Hi Zhangsan.
Hi Lisi.
Hi Wangwu.
Hi Zhaoliu.
3-3 自己的列表:想想你喜歡的通勤方式,如騎摩托車或開汽車,并創(chuàng)建一個包含
多種通勤方式的列表。根據(jù)該列表打印一系列有關(guān)這些通勤方式的宣言,如“I would like
to own a Honda motorcycle”。
bicycles = ['bike','electric car','motorbike','car']
mess1 = "I want to buy an " + bicycles[1].title() + "."
print(mess1)
# 結(jié)果:
I want to buy an Electric Car.
3.2 修改、添加和刪除元素
創(chuàng)建的大多數(shù)列表都將是動態(tài)的,這意味著列表創(chuàng)建后,將隨著程序的運行增刪元素。例如:你創(chuàng)建一個游戲,要求玩家射殺從天而降的外星人;為此,可在開始時將一些外星人存儲在
列表中,然后每當有外星人被射殺時,都將其從列表中刪除,而每次有新的外星人出現(xiàn)在屏幕上
時,都將其添加到列表中。在整個游戲運行期間,外星人列表的長度將不斷變化。
3.2.1 修改列表元素
修改列表元素的語法與訪問列表元素的語法類似。要修改列表元素,可指定列表名和要修改
的元素的索引,再指定該元素的新值。
例如:
motorcycles.py
-----------------------------------------
motorcycles = ['honda','yamaha','suzuki']
print(motorcycles)
motorcycles[0] = 'ducati'
print(motorcycles)
-----------------------------------------
['honda', 'yamaha', 'suzuki']
['ducati', 'yamaha', 'suzuki']
3.2.2 在列表中添加元素
你可能出于眾多原因要在列表中添加新元素,例如,你可能希望游戲中出現(xiàn)新的外星人、添
加可視化數(shù)據(jù)或給網(wǎng)站添加新注冊的用戶。Python提供了多種在既有列表中添加新數(shù)據(jù)的方式。
在列表中添加新元素時,最簡單的方式是將元素附加列表末尾。給列表附加元素時,它將
添加到列表末尾。繼續(xù)使用前一個示例中的列表,在其末尾添加新元素'ducati':
motorcycles.append('ducati')
print(motorcycles)
---------------------------------------
['ducati', 'yamaha', 'suzuki', 'ducat']
# 方法append()將元素'ducati'添加到了列表末尾 ,而不影響列表中的其他所有元素
方法append()讓動態(tài)地創(chuàng)建列表易如反掌,例如,你可以先創(chuàng)建一個空列表,再使用一系列的
append()語句添加元素。下面來創(chuàng)建一個空列表,再在其中添加元素'honda'、'yamaha'和'suzuki':
motorcycles = []
motorcycles.append('honda')
motorcycles.append('yamaha')
motorcycles.append('suzuki')
print(motorcycles)
-----------------------------
['honda', 'yamaha', 'suzuki']
這種創(chuàng)建列表的方式極其常見,因為經(jīng)常要等程序運行后,你才知道用戶要在程序中存儲哪
些數(shù)據(jù)。為控制用戶,可首先創(chuàng)建一個空列表,用于存儲用戶將要輸入的值,然后將用戶提供的
每個新值附加到列表中。
使用方法insert()可在列表的任何位置添加新元素。為此,你需要指定新元素的索引和值。
motorcycles.insert(0,'ducati')
print(motorcycles)
---------------------------------------
['ducati', 'honda', 'yamaha', 'suzuki']
# 在這個示例中,值'ducati'被出入到列表開頭;方法insert()在索引0處添加空間,并將值'ducati'存儲到這個地方。這種操作將列表中既有的每個元素都右一個位置。
3.2.3 從列表中刪除元素
你經(jīng)常需要從列表中刪除一個或多個元素。例如,玩家將空中的一個外星人射殺后,你很可
能要將其從存活的外星人列表中刪除;當用戶在你創(chuàng)建的Web應用中注銷其賬戶時,你需要將該
用戶從活躍用戶列表中刪除。你可以根據(jù)位置或值來刪除列表中的元素。
# 知道要刪除的元素所在列表中的位置,可使用del語句
motorcycles = ['ducati', 'honda', 'yamaha', 'suzuki']
del motorcycles[0]
print(motorcycles)
-----------------------------
['honda', 'yamaha', 'suzuki']
有時候,你要將元素從列表中刪除,并接著使用它的值。例如,你可能需要獲取剛被射殺的
外星人的x和y坐標,以便在相應的位置顯示爆炸效果;在Web應用程序中,你可能要將用戶從活
躍成員列表中刪除,并將其加入到非活躍成員列表中。
方法pop()可刪除列表末尾的元素,并讓你能夠接著使用它。術(shù)語彈出(pop)源自這樣的類
比:列表就像一個棧,而刪除列表末尾的元素相當于彈出棧頂元素。
motorcycles = ['honda','yamaha','suzuki']
print(motorcycles)
popped_motorcycle = motorcycles.pop()
print(motorcycles)
print(popped_motorcycle)
------------------------------------------
['honda', 'yamaha', 'suzuki']
['honda', 'yamaha']
suzuki
方法pop()是怎么起作用的呢?假設(shè)列表中的摩托車是按購買時間存儲的,就可使用方法
pop()打印一條消息,指出最后購買的是哪款摩托車:
motorcycles = ['honda', 'yamaha', 'suzuki']
last_owned = motorcycles.pop()
print("The last motorcycle I owned was a " + last_owned.title() + ".")
-----------------------------------------------------------------------
The last motorcycle I owned was a Suzuki.
可以使用pop()來刪除列表中任何位置的元素,只需在括號中指定要刪除的元素
的索引即可。
first_owned = motorcycles.pop(0)
print("The last motorcycle I owned was a " + first_owned.title() + ".")
-------------------------------------------------------------------------
The last motorcycle I owned was a Honda.
如果你不確定該使用del語句還是pop()方法,下面是一個簡單的判斷標準:如果你要從列表
中刪除一個元素,且不再以任何方式使用它,就使用del語句;如果你要在刪除元素后還能繼續(xù)
使用它,就使用方法pop()。
有時候,你不知道要從列表中刪除的值所處的位置。如果你只知道要刪除的元素的值,可使
用方法remove()。
# 假設(shè)我們要從列表motorcycles中刪除值'ducati'
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
motorcycles = ['honda', 'yamaha', 'suzuki','ducati']
motorcycles.remove('ducati')
print(motorcycles)
-----------------------------------------------------
['honda', 'yamaha', 'suzuki']
使用remove()從列表中刪除元素時,也可接著使用它的值。下面刪除值'ducati',并打印一
條消息,指出要將其從列表中刪除的原因:
motorcycles = ['honda', 'yamaha', 'suzuki','ducati']
too_expensive = 'ducati'
motorcycles.remove(too_expensive)
print(motorcycles)
print("\nA " + too_expensive.title() + " is too expensive for me.")
-------------------------------------------------------------------
['honda', 'yamaha', 'suzuki']
A Ducati is too expensive for me.
注意 方法remove()只刪除第一個指定的值。如果要刪除的值可能在列表中出現(xiàn)多次,就需要
使用循環(huán)來判斷是否刪除了所有這樣的值。你將在第7章學習如何這樣做。
下面的練習比第2 章的練習要復雜些,但讓你有機會以前面介紹過的各種方式使用
列表。
3-4 嘉賓名單:如果你可以邀請任何人一起共進晚餐(無論是在世的還是故去的),
你會邀請哪些人?請創(chuàng)建一個列表,其中包含至少3 個你想邀請的人;然后,使用這個
列表打印消息,邀請這些人來與你共進晚餐。
dinner = []
dinner.append('zhangsan')
dinner.append('lisi')
dinner.append('wangwu')
print(dinner)
---------------------------------------
['zhangsan', 'lisi', 'wangwu']
3-5 修改嘉賓名單:你剛得知有位嘉賓無法赴約,因此需要另外邀請一位嘉賓。
dinner = []
dinner.append('zhangsan')
dinner.append('lisi')
dinner.append('wangwu')
print(dinner)
dinner[1] = 'zhaoliu'
print(dinner)
--------------------------------
['zhangsan', 'lisi', 'wangwu']
['zhangsan', 'zhaoliu', 'wangwu']
dinner = []
dinner.append('zhangsan')
dinner.append('lisi')
dinner.append('wangwu')
print(dinner)
no_dinner = dinner.pop(1)
print(no_dinner + " 無法赴約")
---------------------------------
['zhangsan', 'lisi', 'wangwu']
lisi 無法赴約
dinner = []
dinner.append('zhangsan')
dinner.append('lisi')
dinner.append('wangwu')
print(dinner)
no_dinner = dinner.pop(1)
dinner.insert(1,'zhaoliu')
print(dinner)
--------------------------------
['zhangsan', 'lisi', 'wangwu']
['zhangsan', 'zhaoliu', 'wangwu']
....上述代碼省略
print(dinner[0])
print(dinner[1])
print(dinner[2])
--------------------
zhangsan
zhaoliu
wangwu
3-6 添加嘉賓:你剛找到了一個更大的餐桌,可容納更多的嘉賓。請想想你還想邀
請哪三位嘉賓。
print("找到了一個更大的餐桌")
------------------------------
找到了一個更大的餐桌
dinner.insert(0,'xiaoming')
print(dinner)
---------------------------------------------
['xiaoming', 'zhangsan', 'zhaoliu', 'wangwu']
dinner.insert(2,'xiaofang')
print(dinner)
---------------------------------------------------------
['xiaoming', 'zhangsan', 'xiaofang', 'zhaoliu', 'wangwu']
dinner.append('xiaowu')
print(dinner)
-------------------------------------------------------------------
['xiaoming', 'zhangsan', 'xiaofang', 'zhaoliu', 'wangwu', 'xiaowu']
print("邀請: " + dinner[0])
print("邀請: " + dinner[1])
print("邀請: " + dinner[2])
print("邀請: " + dinner[3])
print("邀請: " + dinner[4])
print("邀請: " + dinner[5])
-----------------------------
邀請: xiaoming
邀請: zhangsan
邀請: xiaofang
邀請: zhaoliu
邀請: wangwu
邀請: xiaowu
3-7 縮減名單:你剛得知新購買的餐桌無法及時送達,因此只能邀請兩位嘉賓。
print("只能邀請兩位嘉賓共進晚餐!")
no_dinner = dinner.pop()
print("I'm sorry " + no_dinner)
no_dinner = dinner.pop()
print("I'm sorry " + no_dinner)
no_dinner = dinner.pop()
print("I'm sorry " + no_dinner)
no_dinner = dinner.pop()
print("I'm sorry " + no_dinner)
-------------------------------
I'm sorry xiaowu
I'm sorry wangwu
I'm sorry zhaoliu
I'm sorry xiaofang
print(dinner)
------------------------
['xiaoming', 'zhangsan']
del dinner[0]
del dinner[0]
print(dinner)
-------------
[]
3.3 組織列表
在你創(chuàng)建的列表中,元素的排列順序常常是無法預測的,因為你并非總能控制用戶提供數(shù)據(jù)
的順序。這雖然在大多數(shù)情況下都是不可避免的,但你經(jīng)常需要以特定的順序呈現(xiàn)信息。有時候,
你希望保留列表元素最初的排列順序,而有時候又需要調(diào)整排列順序。Python提供了很多組織列
表的方式,可根據(jù)具體情況選用。
3.3.1 使用方法sort()對列表進行永久性排序
Python方法sort()讓你能夠較為輕松地對列表進行排序。假設(shè)你有一個汽車列表,并要讓其
中的汽車按字母順序排列。為簡化這項任務,我們假設(shè)該列表中的所有值都是小寫的。
cars.py
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
cars = ['bmw','audi','toyota','subaru']
cars.sort()
print(cars)
-----------------------------------
['audi', 'bmw', 'subaru', 'toyota']
# 方法sort() 永久性地修改了列表元素的排列順序。
# 現(xiàn)在,汽車是按字母順序排列額,再也無法恢復到原來的排列順序
你還可以按與字母順序相反的順序排列列表元素,為此,只需向sort()方法傳遞參數(shù)
reverse=True。下面的示例將汽車列表按與字母順序相反的順序排列:
cars = ['bmw','audi','toyota','subaru']
cars.sort(reverse=True)
print(cars)
-----------------------------------
['toyota', 'subaru', 'bmw', 'audi']
3.3.2 使用函數(shù)sorted()對列表進行臨時排序
要保留列表元素原來的排列順序,同時以特定的順序呈現(xiàn)它們,可使用函數(shù)sorted()。函數(shù)
sorted()讓你能夠按特定順序顯示列表元素,同時不影響它們在列表中的原始排列順序。
下面嘗試對汽車列表調(diào)用這個函數(shù)。
cars = ['bmw','audi','toyota','subaru']
print("Here is the original list:")
print(cars)
print("\nHere is the sorted list:")
print(sorted(cars))
print("\nHere is the original list again:")
print(cars)
--------------------------------------------
Here is the original list:
['bmw', 'audi', 'toyota', 'subaru']
Here is the sorted list:
['audi', 'bmw', 'subaru', 'toyota']
Here is the original list again:
['bmw', 'audi', 'toyota', 'subaru']
注意,調(diào)用函數(shù)sorted()后,列表元素的排列順序并沒有變。如果你要按與字母順
序相反的順序顯示列表,也可向函數(shù)sorted()傳遞參數(shù)reverse=True。
注意 在并非所有的值都是小寫時,按字母順序排列列表要復雜些。決定排列順序時,有多種
解讀大寫字母的方式,要指定準確的排列順序,可能比我們這里所做的要復雜。然而,
大多數(shù)排序方式都基于本節(jié)介紹的知識。
3.3.3 倒著打印列表
要反轉(zhuǎn)列表元素的排列順序,可使用方法reverse()。假設(shè)汽車列表是按購買時間排列的,
可輕松地按相反的順序排列其中的汽車:
cars = ['bmw','audi','toyota','subaru']
print(cars)
cars.reverse()
print(cars)
-----------------------------------------
['bmw', 'audi', 'toyota', 'subaru']
['subaru', 'toyota', 'audi', 'bmw']
注意,reverse()不是指按與字母順序相反的順序排列列表元素,而只是反轉(zhuǎn)列表元素的排
列順序。
方法reverse()永久性地修改列表元素的排列順序,但可隨時恢復到原來的排列順序,為此
只需對列表再次調(diào)用reverse()即可。
3.3.4 確定列表的長度
使用函數(shù)len()可快速獲悉列表的長度。在下面的示例中,列表包含4個元素,因此其長度為4:
>>> cars = ['bmw','audi','toyota','subaru']
>>> len(cars)
4
在你需要完成如下任務時,len()很有用:確定還有多少個外星人未被射殺,需要管理多少
項可視化數(shù)據(jù),網(wǎng)站有多少注冊用戶等。
注意 Python計算列表元素數(shù)時從1開始,因此確定列表長度時,你應該不會遇到差一錯誤。
3-8 放眼世界:想出至少5 個你渴望去旅游的地方。
toponymy = ['thailand','Singapore','japanese','egypt','america']
print(toponymy)
----------------------------------------------------------
['thailand', 'Singapore', 'japanese', 'egypt', 'america']
print(sorted(toponymy))
---------------------------------------------------------
['america', 'egypt', 'japanese', 'singapore', 'thailand']
print(toponymy)
---------------------------------------------------------
['thailand', 'singapore', 'japanese', 'egypt', 'america']
toponymy = ['thailand','japanese','singapore','egypt','america']
print(sorted(toponymy,reverse=True))
----------------------------------------------------------------
['thailand', 'singapore', 'japanese', 'egypt', 'america']
print(toponymy)
---------------------------------------------------------
['thailand', 'japanese', 'singapore', 'egypt', 'america']
toponymy = ['thailand','japanese','singapore','egypt','america']
print("Original list: ")
print(toponymy)
toponymy.reverse()
print("\nModify the list: ")
print(toponymy)
---------------------------------------------------------
Original list:
['thailand', 'japanese', 'singapore', 'egypt', 'america']
Modify the list:
['america', 'egypt', 'singapore', 'japanese', 'thailand']
toponymy.reverse()
print("\nModify the following list again: ")
print(toponymy)
-----------------------------------------------------------
Modify the following list again:
['thailand', 'japanese', 'singapore', 'egypt', 'america']
toponymy = ['thailand','japanese','singapore','egypt','america']
toponymy.sort()
print(toponymy)
---------------------------------------------------------
['america', 'egypt', 'japanese', 'singapore', 'thailand']
toponymy = ['thailand','japanese','singapore','egypt','america']
toponymy.sort()
print(toponymy)
toponymy.sort(reverse=True)
print(toponymy)
----------------------------------------------------------
['america', 'egypt', 'japanese', 'singapore', 'thailand']
['thailand', 'singapore', 'japanese', 'egypt', 'america']
3-9 晚餐嘉賓:在完成練習3-4~練習3-7時編寫的程序之一中,使用len()打印一條消息,指出你邀請了多少位嘉賓來與你共進晚餐。
>>> cars = ['bmw','audi','toyota','subaru']
>>> len(cars)
4
3-10 嘗試使用各個函數(shù):想想可存儲到列表中的東西,如山岳、河流、國家、城市、語言或你喜歡的任何東西。編寫一個程序,在其中創(chuàng)建一個包含這些元素的列表,然后,對于本章介紹的每個函數(shù),都至少使用一次來處理這個列表。
name = ['mount everest','yellow river','beijing','china']
print(name)
print("\n臨時排序: ")
print(sorted(name))
print("\n臨時相反排序: ")
print(sorted(name,reverse=True))
print("\n按字母順序相反排序: ")
name.sort(reverse=True)
print(name)
print("\n按字母排序: ")
name.sort()
print(name)
print("\n倒著打印: ")
name.reverse()
print(name)
print("\n元素個數(shù): ")
print(len(name))
print("\n元素個數(shù): %d" % len(name))
----------------------------------------------------------
['mount everest', 'yellow river', 'beijing', 'china']
臨時排序:
['beijing', 'china', 'mount everest', 'yellow river']
臨時相反排序:
['yellow river', 'mount everest', 'china', 'beijing']
按字母順序相反排序:
['yellow river', 'mount everest', 'china', 'beijing']
按字母排序:
['beijing', 'china', 'mount everest', 'yellow river']
倒著打印:
['yellow river', 'mount everest', 'china', 'beijing']
元素個數(shù):
4
元素個數(shù): 4
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。