第3章
學習目標: git
列表是什麼以及如何使用列表元素。列表讓你可以在一個地方存儲成組的信息,其中能夠只包含幾個元素,也能夠包含數百萬個元素。列表是新手可直接使用的最強大的Python功能之一,它融合了衆多重要的編程概念。編程
3.1 列表是什麼app
列表由一系列按特定順序排列的元素組成。你能夠建立包含字母表中全部字母、數字0~9或
全部家庭成員姓名的列表;也能夠將任何東西加入列表中,其中的元素之間能夠沒有任何關係。
鑑於列表一般包含多個元素,給列表指定一個表示複數的名稱(如letters、digits或names)是
個不錯的主意。編程語言
在Python中,用中括號 [] 表示列表,並用逗號來分隔其中的元素。ide
例如:函數
bicycles.py bicycles = [ 'trek','cannondale','redline','specialired' ] print(bicycles) # 結果: ['trek', 'cannondale', 'redline', 'specialired']
3.1.1 訪問列表元素學習
列表是有序集合,所以要訪問列表的任何元素,只需將該元素的位置或索引告訴Python便可。
要訪問列表元素,可指出列表的名稱,再指出元素的索引,並將其放在方括號內。網站
# 例如,從列表bicycles中提取第一款自行車 bicycles = [ 'trek','cannondale','redline','specialired' ] print(bicycles[0]) # 結果: trek # 固然,或者 可以使用方法title()讓元素 'trek'的格式更整潔: print(bicycles[0].title()) # 這個示例的輸出與前一個示例相同,只是首字母T是大寫的。
3.1.2 檢索從0而不是1開始rest
在Python中,第一個列表元素的索引爲0,而不是1。在大多數編程語言中都是如此,這與列
表操做的底層實現相關。code
print(bicycles[1]) print(bicycles[3]) # 這些代碼返回列表中得第二個和第四個元素: cannondale specialized # Python爲訪問最後一個列表元素提供了一種特殊語法。經過將索引指定爲-1,可以讓Python返 回最後一個列表元素: print(bicycles[-1]) 這些代碼返回'specialized'。這種語法頗有用,由於你常常須要在不知道列表長度的狀況 下訪問最後的元素。這種約定也適用於其餘負數索引,例如,索引-2返回倒數第二個列表元素, 索引-3返回倒數第三個列表元素,以此類推。
3.1.3 使用列表中的各個值
可像使用其餘變量同樣使用列表中的各個值。例如,你可使用拼接根據列表中的值來建立
消息。
下面來嘗試從列表中提取第一款自行車,並使用這個值來建立一條消息:
message = "My first bicycle was a " + bicycles[0].title() + "." print(message) # 結果: My first bicycle was a Trek.
請嘗試編寫一些簡短的程序來完成下面的練習,以得到一些使用Python 列表的第
一手經驗。你可能須要爲每章的練習建立一個文件夾,以整潔有序的方式存儲爲完成各
章的練習而編寫的程序。
3-1 姓名:將一些朋友的姓名存儲在一個列表中,並將其命名爲names。依次訪問
該列表中的每一個元素,從而將每一個朋友的姓名都打印出來。
names = [ 'zhangsan','lisi','wangwu','zhaoliu'] print(names[0]) print(names[1]) print(names[-2]) print(names[-1]) # 結果: zhangsan lisi wangwu zhaoliu
3-2 問候語:繼續使用練習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) # 結果: Hi Zhangsan. Hi Lisi. Hi Wangwu. Hi Zhaoliu.
3-3 本身的列表:想一想你喜歡的通勤方式,如騎摩托車或開汽車,並建立一個包含
多種通勤方式的列表。根據該列表打印一系列有關這些通勤方式的宣言,如「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) # 結果: I want to buy an Electric Car.
3.2 修改、添加和刪除元素
建立的大多數列表都將是動態的,這意味着列表建立後,將隨着程序的運行增刪元素。例如:你建立一個遊戲,要求玩家射殺從天而降的外星人;爲此,可在開始時將一些外星人存儲在
列表中,而後每當有外星人被射殺時,都將其從列表中刪除,而每次有新的外星人出如今屏幕上
時,都將其添加到列表中。在整個遊戲運行期間,外星人列表的長度將不斷變化。
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 在列表中添加元素
你可能出於衆多緣由要在列表中添加新元素,例如,你可能但願遊戲中出現新的外星人、添
加可視化數據或給網站添加新註冊的用戶。Python提供了多種在既有列表中添加新數據的方式。
在列表中添加新元素時,最簡單的方式是將元素附加列表末尾。給列表附加元素時,它將
添加到列表末尾。繼續使用前一個示例中的列表,在其末尾添加新元素'ducati':
motorcycles.append('ducati') print(motorcycles) --------------------------------------- ['ducati', 'yamaha', 'suzuki', 'ducat'] # 方法append()將元素'ducati'添加到了列表末尾 ,而不影響列表中的其餘全部元素
方法append()讓動態地建立列表易如反掌,例如,你能夠先建立一個空列表,再使用一系列的
append()語句添加元素。下面來建立一個空列表,再在其中添加元素'honda'、'yamaha'和'suzuki':
motorcycles = [] motorcycles.append('honda') motorcycles.append('yamaha') motorcycles.append('suzuki') print(motorcycles) ----------------------------- ['honda', 'yamaha', 'suzuki']
這種建立列表的方式極其常見,由於常常要等程序運行後,你才知道用戶要在程序中存儲哪
些數據。爲控制用戶,可首先建立一個空列表,用於存儲用戶將要輸入的值,而後將用戶提供的
每一個新值附加到列表中。
使用方法insert()可在列表的任何位置添加新元素。爲此,你須要指定新元素的索引和值。
motorcycles.insert(0,'ducati') print(motorcycles) --------------------------------------- ['ducati', 'honda', 'yamaha', 'suzuki'] # 在這個示例中,值'ducati'被出入到列表開頭;方法insert()在索引0處添加空間,並將值'ducati'存儲到這個地方。這種操做將列表中既有的每一個元素都右一個位置。
3.2.3 從列表中刪除元素
你常常須要從列表中刪除一個或多個元素。例如,玩家將空中的一個外星人射殺後,你很可
能要將其從存活的外星人列表中刪除;當用戶在你建立的Web應用中註銷其帳戶時,你須要將該
用戶從活躍用戶列表中刪除。你能夠根據位置或值來刪除列表中的元素。
# 知道要刪除的元素所在列表中的位置,可以使用del語句 motorcycles = ['ducati', 'honda', 'yamaha', 'suzuki'] del motorcycles[0] print(motorcycles) ----------------------------- ['honda', 'yamaha', 'suzuki']
有時候,你要將元素從列表中刪除,並接着使用它的值。例如,你可能須要獲取剛被射殺的
外星人的x和y座標,以便在相應的位置顯示爆炸效果;在Web應用程序中,你可能要將用戶從活
躍成員列表中刪除,並將其加入到非活躍成員列表中。
方法pop()可刪除列表末尾的元素,並讓你可以接着使用它。術語彈出(pop)源自這樣的類
比:列表就像一個棧,而刪除列表末尾的元素至關於彈出棧頂元素。
motorcycles = ['honda','yamaha','suzuki'] print(motorcycles) popped_motorcycle = motorcycles.pop() print(motorcycles) print(popped_motorcycle) ------------------------------------------ ['honda', 'yamaha', 'suzuki'] ['honda', 'yamaha'] suzuki
方法pop()是怎麼起做用的呢?假設列表中的摩托車是按購買時間存儲的,就可以使用方法
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語句;若是你要在刪除元素後還能繼續
使用它,就使用方法pop()。
有時候,你不知道要從列表中刪除的值所處的位置。若是你只知道要刪除的元素的值,可以使
用方法remove()。
# 假設咱們要從列表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()只刪除第一個指定的值。若是要刪除的值可能在列表中出現屢次,就須要
使用循環來判斷是否刪除了全部這樣的值。你將在第7章學習如何這樣作。
下面的練習比第2 章的練習要複雜些,但讓你有機會之前面介紹過的各類方式使用
列表。
3-4 嘉賓名單:若是你能夠邀請任何人一塊兒共進晚餐(不管是在世的仍是故去的),
你會邀請哪些人?請建立一個列表,其中包含至少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 組織列表
在你建立的列表中,元素的排列順序經常是沒法預測的,由於你並不是總能控制用戶提供數據
的順序。這雖然在大多數狀況下都是不可避免的,但你常常須要以特定的順序呈現信息。有時候,
你但願保留列表元素最初的排列順序,而有時候又須要調整排列順序。Python提供了不少組織列
表的方式,可根據具體狀況選用。
3.3.1 使用方法sort()對列表進行永久性排序
Python方法sort()讓你可以較爲輕鬆地對列表進行排序。假設你有一個汽車列表,並要讓其
中的汽車按字母順序排列。爲簡化這項任務,咱們假設該列表中的全部值都是小寫的。
cars.py <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< cars = ['bmw','audi','toyota','subaru'] cars.sort() print(cars) ----------------------------------- ['audi', 'bmw', 'subaru', 'toyota'] # 方法sort() 永久性地修改了列表元素的排列順序。 # 如今,汽車是按字母順序排列額,再也沒法恢復到原來的排列順序
你還能夠按與字母順序相反的順序排列列表元素,爲此,只需向sort()方法傳遞參數
reverse=True。下面的示例將汽車列表按與字母順序相反的順序排列:
cars = ['bmw','audi','toyota','subaru'] cars.sort(reverse=True) print(cars) ----------------------------------- ['toyota', 'subaru', 'bmw', 'audi']
3.3.2 使用函數sorted()對列表進行臨時排序
要保留列表元素原來的排列順序,同時以特定的順序呈現它們,可以使用函數sorted()。函數
sorted()讓你可以按特定順序顯示列表元素,同時不影響它們在列表中的原始排列順序。
下面嘗試對汽車列表調用這個函數。
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']
注意,調用函數sorted()後,列表元素的排列順序並無變。若是你要按與字母順
序相反的順序顯示列表,也可向函數sorted()傳遞參數reverse=True。
注意 在並不是全部的值都是小寫時,按字母順序排列列表要複雜些。決定排列順序時,有多種
解讀大寫字母的方式,要指定準確的排列順序,可能比咱們這裏所作的要複雜。然而,
大多數排序方式都基於本節介紹的知識。
3.3.3 倒着打印列表
要反轉列表元素的排列順序,可以使用方法reverse()。假設汽車列表是按購買時間排列的,
可輕鬆地按相反的順序排列其中的汽車:
cars = ['bmw','audi','toyota','subaru'] print(cars) cars.reverse() print(cars) ----------------------------------------- ['bmw', 'audi', 'toyota', 'subaru'] ['subaru', 'toyota', 'audi', 'bmw']
注意,reverse()不是指按與字母順序相反的順序排列列表元素,而只是反轉列表元素的排
列順序。
方法reverse()永久性地修改列表元素的排列順序,但可隨時恢復到原來的排列順序,爲此
只需對列表再次調用reverse()便可。
3.3.4 肯定列表的長度
使用函數len()可快速獲悉列表的長度。在下面的示例中,列表包含4個元素,所以其長度爲4:
>>> cars = ['bmw','audi','toyota','subaru'] >>> len(cars) 4
在你須要完成以下任務時,len()頗有用:肯定還有多少個外星人未被射殺,須要管理多少
項可視化數據,網站有多少註冊用戶等。
注意 Python計算列表元素數時從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 嘗試使用各個函數:想一想可存儲到列表中的東西,如山嶽、河流、國家、城市、語言或你喜歡的任何東西。編寫一個程序,在其中建立一個包含這些元素的列表,而後,對於本章介紹的每一個函數,都至少使用一次來處理這個列表。
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元素個數: ") print(len(name)) print("\n元素個數: %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'] 元素個數: 4 元素個數: 4