申明: 本站飛宇網 https://feiyetopro.blogspot.com/。自網路收集整理之書籍、文章、影音僅供預覽交流學習研究,其[書籍、文章、影音]情節內容, 評論屬其個人行為, 與本網站無關。版權歸原作者和出版社所有,請在下載 24 小時內刪除,不得用作商業用途;如果您喜歡其作品,請支持訂閱購買[正版]。謝謝!
第 3 章 列表簡介
在本章和下一章中,你將學習列表是什麼以及如何使用清單元素。清單讓你能夠在一個地方存儲成組的資訊,其中可以只包含幾個元素,也可以包含數百萬個元素。列表是新手可直接使用的最強大的Python功能之一,它融合了眾多重要的程式設計概念。
3.1 列表是什麼
清單 由一系列按特定順序排列的元素組成。你可以創建包含字母表中所有字母、數位0~9或所有家庭成員姓名的列表;也可以將任何東西加入清單中,其中的元素之間可以沒有任何關係。鑒於清單通常包含多個元素,給清單指定一個表示複數的名稱(如letters 、digits 或names )是個不錯的主意。
在Python中,用方括號([] )來表示列表,並用逗號來分隔其中的元素。下面是一個簡單的列表示例,這個列表包含幾種自行車:
bicycles.py
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles)
如果你讓Python將列表列印出來,Python將列印列表的內部表示,包括方括號:
['trek', 'cannondale', 'redline', 'specialized']
鑒於這不是你要讓用戶看到的輸出,下面來學習如何訪問清單元素。
3.1.1 訪問清單元素
清單是有序集合,因此要訪問清單的任何元素,只需將該元素的位置或索引告訴Python即可。要訪問清單元素,可指出清單的名稱,再指出元素的索引,並將其放在方括號內。
例如,下面的代碼從列表bicycles 中提取第一款自行車:
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
❶ print(bicycles[0])
❶處演示了訪問清單元素的語法。當你請求獲取清單元素時,Python只返回該元素,而不包括方括號和引號:
trek
這正是你要讓用戶看到的結果——整潔、乾淨的輸出。
你還可以對任何清單元素調用第2章介紹的字串方法。例如,可使用方法title() 讓元素'trek' 的格式更整潔:
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[0].title())
這個示例的輸出與前一個示例相同,只是首字母T是大寫的。
3.1.2 索引從0而不是1開始
在Python中,第一個清單元素的索引為0,而不是1。在大多數程式設計語言中都是如此,這與清單操作的底層實現相關。如果結果出乎意料,請看看你是否犯了簡單的差一錯誤。
第二個清單元素的索引為1。根據這種簡單的計數方式,要訪問清單的任何元素,都可將其位置減1,並將結果作為索引。例如,要訪問第四個清單元素,可使用索引3。
下面的代碼訪問索引1 和3 處的自行車:
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[1])
print(bicycles[3])
這些代碼返回清單中的第二個和第四個元素:
cannondale
specialized
Python為訪問最後一個清單元素提供了一種特殊語法。通過將索引指定為-1 ,可讓Python返回最後一個清單元素:
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[-1])
這些代碼返回'specialized' 。這種語法很有用,因為你經常需要在不知道清單長度的情況下訪問最後的元素。這種約定也適用於其他負數索引,例如,索引-2 返回倒數第二個清單元素,索引-3 返回倒數第三個清單元素,以此類推。
3.1.3 使用列表中的各個值
可像使用其他變數一樣使用清單中的各個值。例如,你可以使用拼接根據清單中的值來創建消息。
下面來嘗試從列表中提取第一款自行車,並使用這個值來創建一條消息:
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
❶ message =
"My first bicycle was a " + bicycles[0].title() + "."
print(message)
我們使用bicycles[0] 的值生成了一個句子,並將其存儲在變數message 中(見❶)。輸出是一個簡單的句子,其中包含列表中的第一款自行車:
My first bicycle was a Trek.
動手試一試
請嘗試編寫一些簡短的程式來完成下面的練習,以獲得一些使用Python列表的第一手經驗。你可能需要為每章的練習創建一個資料夾,以整潔有序的方式存儲為完成各章的練習而編寫的程式。
3-1 姓名: 將一些朋友的姓名存儲在一個清單中,並將其命名為names 。依次訪問該清單中的每個元素,從而將每個朋友的姓名都列印出來。
names = ['ron', 'tyler', 'dani']
print(names[0])
print(names[1])
print(names[2])
輸出:
ron
tyler
dani
3-2 問候語: 繼續使用練習3-1中的列表,但不列印每個朋友的姓名,而為每人列印一條消息。每條消息都包含相同的問候語,但抬頭為相應朋友的姓名。
names = ['ron', 'tyler', 'dani']
msg = "Hello, " + names[0].title() + "!"
print(msg)
msg = "Hello, " + names[1].title() + "!"
print(msg)
msg = "Hello, " + names[2].title() + "!"
print(msg)
輸出:
Hello, Ron!
Hello, Tyler!
Hello, Dani!
3-3 自己的列表: 想想你喜歡的通勤方式,如騎摩托車或開汽車,並創建一個包含多種通勤方式的清單。根據該清單列印一系列有關這些通勤方式的宣言,如“I would like to
own a Honda motorcycle”。
3.2 修改、添加和刪除元素
你創建的大多數清單都將是動態的,這意味著清單創建後,將隨著程式的運行增刪元素。例如,你創建一個遊戲,要求玩家射殺從天而降的外星人;為此,可在開始時將一些外星人存儲在清單中,然後每當有外星人被射殺時,都將其從列表中刪除,而每次有新的外星人出現在螢幕上時,都將其添加到列表中。在整個遊戲運行期間,外星人列表的長度將不斷變化。
3.2.1 修改清單元素
修改清單元素的語法與訪問清單元素的語法類似。要修改清單元素,可指定清單名和要修改的元素的索引,再指定該元素的新值。
例如,假設有一個摩托車列表,其中的第一個元素為'honda' ,如何修改它的值呢?
motorcycles.py
❶ motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
❷
motorcycles[0] = 'ducati'
print(motorcycles)
我們首先定義一個摩托車列表,其中的第一個元素為'honda' (見❶)。接下來,我們將第一個元素的值改為'ducati' (見❷)。輸出表明,第一個元素的值確實變了,但其他清單元素的值沒變:
['honda', 'yamaha', 'suzuki']
['ducati', 'yamaha', 'suzuki']
你可以修改任何清單元素的值,而不僅僅是第一個元素的值。
3.2.2 在清單中添加元素
你可能出於眾多原因要在清單中添加新元素,例如,你可能希望遊戲中出現新的外星人、添加視覺化資料或給網站添加新註冊的用戶。Python提供了多種在既有清單中添加新資料的方式。
1. 在清單末尾添加元素
在清單中添加新元素時,最簡單的方式是將元素附加到清單末尾。給清單附加元素時,它將添加到列表末尾。繼續使用前一個示例中的列表,在其末尾添加新元素'ducati' :
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
❶
motorcycles.append('ducati')
print(motorcycles)
方法append() 將元素'ducati' 添加到了列表末尾(見❶ ),而不影響清單中的其他所有元素:
['honda', 'yamaha', 'suzuki']
['honda', 'yamaha', 'suzuki', 'ducati']
方法append() 讓動態地創建清單易如反掌,例如,你可以先創建一個空列表,再使用一系列的append() 語句添加元素。下面來創建一個空列表,再在其中添加元素'honda' 、'yamaha' 和'suzuki' :
motorcycles = []
motorcycles.append('honda')
motorcycles.append('yamaha')
motorcycles.append('suzuki')
print(motorcycles)
最終的列表與前述示例中的列表完全相同:
['honda', 'yamaha', 'suzuki']
這種創建清單的方式極其常見,因為經常要等程式運行後,你才知道使用者要在程式中存儲哪些資料。為控制用戶,可首先創建一個空清單,用於存儲使用者將要輸入的值,然後將用戶提供的每個新值附加到列表中。
2. 在清單中插入元素
使用方法insert() 可在列表的任何位置添加新元素。為此,你需要指定新元素的索引和值。
motorcycles = ['honda', 'yamaha', 'suzuki']
❶
motorcycles.insert(0, 'ducati')
print(motorcycles)
在這個示例中,值'ducati' 被插入到了列表開頭(見❶);方法insert() 在索引0 處添加空間,並將值'ducati' 存儲到這個地方。這種操作將清單中既有的每個元素都右移一個位置:
['ducati', 'honda', 'yamaha', 'suzuki']
3.2.3 從清單中刪除元素
你經常需要從清單中刪除一個或多個元素。例如,玩家將空中的一個外星人射殺後,你很可能要將其從存活的外星人列表中刪除;當用戶在你創建的Web應用中註銷其帳戶時,你需要將該使用者從活躍用戶列表中刪除。你可以根據位置或值來刪除清單中的元素。
1. 使用del 語句刪除元素
如果知道要刪除的元素在清單中的位置,可使用del 語句。
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
❶ del
motorcycles[0]
print(motorcycles)
❶ 處的代碼使用del 刪除了清單motorcycles 中的第一個元素——'honda' :
['honda', 'yamaha', 'suzuki']
['yamaha', 'suzuki']
使用del 可刪除任何位置處的清單元素,條件是知道其索引。下例演示了如何刪除前述清單中的第二個元素——'yamaha' :
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
del
motorcycles[1]
print(motorcycles)
下面的輸出表明,已經將第二款摩托車從列表中刪除了:
['honda',
'yamaha', 'suzuki']
['honda',
'suzuki']
在這兩個示例中,使用del 語句將值從列表中刪除後,你就無法再訪問它了。
2. 使用方法pop() 刪除元素
有時候,你要將元素從清單中刪除,並接著使用它的值。例如,你可能需要獲取剛被射殺的外星人的 x 和 y 座標,以便在相應的位置顯示爆炸效果;在Web應用程式中,你可能要將用戶從活躍成員列表中刪除,並將其加入到非活躍成員列表中。
方法pop() 可刪除清單末尾的元素,並讓你能夠接著使用它。術語彈出 (pop)源自這樣的類比:列表就像一個棧,而刪除清單末尾的元素相當於彈出棧頂元素。
下麵從列表motorcycles 中彈出一款摩托車:
❶
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
❷ popped_motorcycle
= motorcycles.pop()
❸
print(motorcycles)
❹
print(popped_motorcycle)
我們首先定義並列印了列表motorcycles (見❶)。接下來,我們從這個列表中彈出一個值,並將其存儲到變數popped_motorcycle 中(見❷)。然後我們列印這個列表,以核實從其中刪除了一個值(見❸)。最後,我們列印彈出的值,以證明我們依然能夠訪問被刪除的值(見❹)。
輸出表明,列表末尾的值'suzuki' 已刪除,它現在存儲在變數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.
3. 彈出清單中任何位置處的元素
實際上,你可以使用pop() 來刪除清單中任何位置的元素,只需在括弧中指定要刪除的元素的索引即可。
motorcycles = ['honda', 'yamaha', 'suzuki']
❶ first_owned
= motorcycles.pop(0)
❷
print('The first motorcycle I owned was a ' + first_owned.title() + '.')
首先,我們彈出了列表中的第一款摩托車(見❶),然後列印了一條有關這輛摩托車的消息(見❷)。輸出是一個簡單的句子,描述了我購買的第一輛摩托車:
The
first motorcycle I owned was a Honda.
別忘了,每當你使用pop() 時,被彈出的元素就不再在清單中了。
如果你不確定該使用del 語句還是pop() 方法,下面是一個簡單的判斷標準:如果你要從清單中刪除一個元素,且不再以任何方式使用它,就使用del 語句;如果你要在刪除元素後還能繼續使用它,就使用方法pop() 。
4. 根據值刪除元素
有時候,你不知道要從列表中刪除的值所處的位置。如果你只知道要刪除的元素的值,可使用方法remove() 。
例如,假設我們要從列表motorcycles 中刪除值'ducati' 。
motorcycles = ['honda', 'yamaha', 'suzuki',
'ducati']
print(motorcycles)
❶
motorcycles.remove('ducati')
print(motorcycles)
❶ 處的代碼讓Python確定'ducati' 出現在列表的什麼地方,並將該元素刪除:
['honda',
'yamaha', 'suzuki', 'ducati']
['honda',
'yamaha', 'suzuki']
使用remove() 從清單中刪除元素時,也可接著使用它的值。下面刪除值'ducati' ,並列印一條消息,指出要將其從列表中刪除的原因:
❶
motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']
print(motorcycles)
❷
too_expensive = 'ducati'
❸
motorcycles.remove(too_expensive)
print(motorcycles)
❹ print("\nA
" + too_expensive.title() + " is too expensive for me.")
在❶處定義列表後,我們將值'ducati' 存儲在變數too_expensive 中(見❷)。接下來,我們使用這個變數來告訴Python將哪個值從列表中刪除(見❸)。最後,值'ducati' 已經從列表中刪除,但它還存儲在變數too_expensive 中(見❹),讓我們能夠列印一條消息,指出將'ducati' 從列表motorcycles 中刪除的原因:
['honda',
'yamaha', 'suzuki', 'ducati']
['honda',
'yamaha', 'suzuki']
A
Ducati is too expensive for me.
>
注意 方法remove() 只刪除第一個指定的值。如果要刪除的值可能在列表中出現多次,就需要使用迴圈來判斷是否刪除了所有這樣的值。你將在第7章學習如何這樣做。
動手試一試
下面的練習比第2章的練習要複雜些,但讓你有機會以前面介紹過的各種方式使用清單。
3-4 嘉賓名單 :如果你可以邀請任何人一起共進晚餐(無論是在世的還是故去的),你會邀請哪些人?請創建一個列表,其中包含至少3個你想邀請的人;然後,使用這個清單列印消息,邀請這些人來與你共進晚餐。
guests = ['guido van
rossum', 'jack turner', 'lynn hill']
name = guests[0].title()
print(name + ", please come to dinner.")
name = guests[1].title()
print(name + ", please come to dinner.")
name = guests[2].title()
print(name + ", please come to dinner.")
輸出:
Guido Van Rossum, please come to dinner.
Jack Turner, please come to dinner.
Lynn Hill, please come to dinner.
3-5 修改嘉賓名單 :你剛得知有位元嘉賓無法赴約,因此需要另外邀請一位元嘉賓。
·
以完成練習3-4時編寫的程式為基礎,在程式末尾添加一條print 語句,指出哪位嘉賓無法赴約。
·
修改嘉賓名單,將無法赴約的嘉賓的姓名替換為新邀請的嘉賓的姓名。
·
再次列印一系列消息,向名單中的每位嘉賓發出邀請。
# 邀請一些嘉賓與你共進晚餐。
guests = ['guido van
rossum', 'jack turner', 'lynn hill']
name = guests[0].title()
print(name + ", please come to dinner.")
name = guests[1].title()
print(name + ", please come to dinner.")
name = guests[2].title()
print(name + ", please come to dinner.")
name = guests[1].title()
print("\nSorry,
" + name + " can't make it to dinner.")
# Jack無法赴約,轉而邀請Gary。
del(guests[1])
guests.insert(1, 'gary snyder')
# 重新列印邀請函。
name = guests[0].title()
print("\n" + name + ", please come to dinner.")
name = guests[1].title()
print(name + ", please come to dinner.")
name = guests[2].title()
print(name + ", please come to dinner.")
輸出:
Guido Van Rossum, please come to dinner.
Jack Turner, please come to dinner.
Lynn Hill, please come to dinner.
Sorry, Jack Turner can't make it to dinner.
Guido Van Rossum, please come to dinner.
Gary Snyder, please come to dinner.
Lynn Hill, please come to dinner.
3-6 添加嘉賓 :你剛找到了一個更大的餐桌,可容納更多的嘉賓。請想想你還想邀請哪三位嘉賓。
·
以完成練習3-4或練習3-5時編寫的程式為基礎,在程式末尾添加一條print 語句,指出你找到了一個更大的餐桌。
·
使用insert() 將一位新嘉賓添加到名單開頭。
·
使用insert() 將另一位新嘉賓添加到名單中間。
·
使用append() 將最後一位新嘉賓添加到名單末尾。
·
列印一系列消息,向名單中的每位嘉賓發出邀請。
# 邀請一些嘉賓與你共進晚餐。
guests = ['guido van
rossum', 'jack turner', 'lynn hill']
name = guests[0].title()
print(name + ", please come to dinner.")
name = guests[1].title()
print(name + ", please come to dinner.")
name = guests[2].title()
print(name + ", please come to dinner.")
name = guests[1].title()
print("\nSorry,
" + name + " can't make it to dinner.")
# Jack無法赴約,轉而邀請Gary。
del(guests[1])
guests.insert(1, 'gary snyder')
# 重新列印邀請函。
name = guests[0].title()
print("\n" + name + ", please come to dinner.")
name = guests[1].title()
print(name + ", please come to dinner.")
name = guests[2].title()
print(name + ", please come to dinner.")
# 找到了更大的餐桌,再邀請一些嘉賓。
print("\nWe got a
bigger table!")
guests.insert(0, 'frida kahlo')
guests.insert(2, 'reinhold messner')
guests.append('elizabeth peratrovich')
name = guests[0].title()
print(name + ", please come to dinner.")
name = guests[1].title()
print(name + ", please come to dinner.")
name = guests[2].title()
print(name + ", please come to dinner.")
name = guests[3].title()
print(name + ", please come to dinner.")
name = guests[4].title()
print(name + ", please come to dinner.")
name = guests[5].title()
print(name + ", please come to dinner.")
輸出:
Guido Van Rossum, please come to dinner.
Jack Turner, please come to dinner.
Lynn Hill, please come to dinner.
Sorry, Jack Turner can't make it to dinner.
Guido Van Rossum, please come to dinner.
Gary Snyder, please come to dinner.
Lynn Hill, please come to dinner.
We got a bigger table!
Frida Kahlo, please come to dinner.
Guido Van Rossum, please come to dinner.
Reinhold Messner, please come to dinner.
Gary Snyder, please come to dinner.
Lynn Hill, please come to dinner.
Elizabeth Peratrovich, please come to dinner.
3-7 縮減名單 :你剛得知新購買的餐桌無法及時送達,因此只能邀請兩位嘉賓。
·
以完成練習3-6時編寫的程式為基礎,在程式末尾添加一行代碼,列印一條你只能邀請兩位嘉賓共進晚餐的消息。
·
使用pop() 不斷地刪除名單中的嘉賓,直到只有兩位嘉賓為止。每次從名單中彈出一位嘉賓時,都列印一條消息,讓該嘉賓知悉你很抱歉,無法邀請他來共進晚餐。
·
對於餘下的兩位嘉賓中的每一位,都列印一條消息,指出他依然在受邀人之列。
·
使用del 將最後兩位嘉賓從名單中刪除,讓名單變成空的。列印該名單,核實程式結束時名單確實是空的。
# 邀請一些嘉賓與你共進晚餐。
guests = ['guido van
rossum', 'jack turner', 'lynn hill']
name = guests[0].title()
print(name + ", please come to dinner.")
name = guests[1].title()
print(name + ", please come to dinner.")
name = guests[2].title()
print(name + ", please come to dinner.")
name = guests[1].title()
print("\nSorry,
" + name + " can't make it to dinner.")
# Jack無法赴約,轉而邀請Gary。
del(guests[1])
guests.insert(1, 'gary snyder')
# 重新列印邀請函。
name = guests[0].title()
print("\n" + name + ", please come to dinner.")
name = guests[1].title()
print(name + ", please come to dinner.")
name = guests[2].title()
print(name + ", please come to dinner.")
# 找到了更大的餐桌,再邀請一些嘉賓。
print("\nWe got a
bigger table!")
guests.insert(0, 'frida kahlo')
guests.insert(2, 'reinhold messner')
guests.append('elizabeth peratrovich')
name = guests[0].title()
print(name + ", please come to dinner.")
name = guests[1].title()
print(name + ", please come to dinner.")
name = guests[2].title()
print(name + ", please come to dinner.")
name = guests[3].title()
print(name + ", please come to dinner.")
name = guests[4].title()
print(name + ", please come to dinner.")
name = guests[5].title()
print(name + ", please come to dinner.")
# 糟糕,餐桌無法及時送達!
print("\nSorry,
we can only invite two people to dinner.")
name = guests.pop()
print("Sorry,
" + name.title() + " there's no room at the table.")
name = guests.pop()
print("Sorry,
" + name.title() + " there's no room at the table.")
name = guests.pop()
print("Sorry,
" + name.title() + " there's no room at the table.")
name = guests.pop()
print("Sorry,
" + name.title() + " there's no room at the table.")
# 應該只剩下兩位嘉賓了,向他們發出邀請。
name = guests[0].title()
print(name + ", please come to dinner.")
name = guests[1].title()
print(name + ", please come to dinner.")
# 清空名單。
del(guests[0])
del(guests[0])
# 核實名單是空的。
print(guests)
輸出:
Guido Van Rossum, please come to dinner.
Jack Turner, please come to dinner.
Lynn Hill, please come to dinner.
Sorry, Jack Turner can't make it to dinner.
Guido Van Rossum, please come to dinner.
Gary Snyder, please come to dinner.
Lynn Hill, please come to dinner.
We got a bigger table!
Frida Kahlo, please come to dinner.
Guido Van Rossum, please come to dinner.
Reinhold Messner, please come to dinner.
Gary Snyder, please come to dinner.
Lynn Hill, please come to dinner.
Elizabeth Peratrovich, please come to dinner.
Sorry, we can only invite two people to dinner.
Sorry, Elizabeth Peratrovich there's no room at the table.
Sorry, Lynn Hill there's no room at the table.
Sorry, Gary Snyder there's no room at the table.
Sorry, Reinhold Messner there's no room at the table.
Frida Kahlo, please come to dinner.
Guido Van Rossum, please come to dinner.
[]
3.3 組織清單
在你創建的清單中,元素的排列順序常常是無法預測的,因為你並非總能控制使用者提供資料的順序。這雖然在大多數情況下都是不可避免的,但你經常需要以特定的順序呈現資訊。有時候,你希望保留清單元素最初的排列順序,而有時候又需要調整排列順序。Python提供了很多組織清單的方式,可根據具體情況選用。
3.3.1 使用方法sort() 對列表進行永久性排序
Python方法sort() 讓你能夠較為輕鬆地對列表進行排序。假設你有一個汽車列表,並要讓其中的汽車按字母順序排列。為簡化這項任務,我們假設該列表中的所有值都是小寫的。
cars.py
cars = ['bmw', 'audi', 'toyota', 'subaru']
❶ cars.sort()
print(cars)
方法sort() (見❶)永久性地修改了清單元素的排列順序。現在,汽車是按字母順序排列的,再也無法恢復到原來的排列順序:
['audi',
'bmw', 'subaru', 'toyota']
你還可以按與字母順序相反的順序排列清單元素,為此,只需向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)
注意,reverse() 不是指按與字母順序相反的順序排列清單元素,而只是反轉清單元素的排列順序:
['bmw',
'audi', 'toyota', 'subaru']
['subaru',
'toyota', 'audi', 'bmw']
方法reverse() 永久性地修改清單元素的排列順序,但可隨時恢復到原來的排列順序,為此只需對清單再次調用reverse() 即可。
3.3.4 確定列表的長度
使用函數len() 可快速獲悉列表的長度。在下面的示例中,清單包含4個元素,因此其長度為4:
>>>
cars = ['bmw', 'audi', 'toyota', 'subaru']
>>>
len(cars)
4
在你需要完成如下任務時,len() 很有用:確定還有多少個外星人未被射殺,需要管理多少項視覺化資料,網站有多少註冊用戶等。
注意 Python計算列表元素數時從1開始,因此確定列表長度時,你應該不會遇到差一錯誤。
動手試一試
3-8 放眼世界 :想出至少5個你渴望去旅遊的地方。
·
將這些地方存儲在一個清單中,並確保其中的元素不是按字母順序排列的。
·
按原始排列順序列印該清單。不要考慮輸出是否整潔的問題,只管列印原始Python列表。
·
使用sorted() 按字母順序列印這個清單,同時不要修改它。
·
再次列印該清單,核實排列順序未變。
·
使用sorted() 按與字母順序相反的順序列印這個清單,同時不要修改它。
·
再次列印該清單,核實排列順序未變。
·
使用reverse() 修改清單元素的排列順序。列印該清單,核實排列順序確實變了。
·
使用reverse() 再次修改清單元素的排列順序。列印該列表,核實已恢復到原來的排列順序。
·
使用sort() 修改該清單,使其元素按字母順序排列。列印該清單,核實排列順序確實變了。
·
使用sort() 修改該清單,使其元素按與字母順序相反的順序排列。列印該清單,核實排列順序確實變了。
locations = ['himalaya', 'andes', 'tierra del fuego', 'labrador', 'guam']
print("Original
order:")
print(locations)
print("\nAlphabetical:")
print(sorted(locations))
print("\nOriginal
order:")
print(locations)
print("\nReverse
alphabetical:")
print(sorted(locations, reverse=True))
print("\nOriginal
order:")
print(locations)
print("\nReversed:")
locations.reverse()
print(locations)
print("\nOriginal
order:")
locations.reverse()
print(locations)
print("\nAlphabetical")
locations.sort()
print(locations)
print("\nReverse
alphabetical")
locations.sort(reverse=True)
print(locations)
輸出:
Original order:
['himalaya', 'andes', 'tierra del fuego', 'labrador', 'guam']
Alphabetical:
['andes', 'guam', 'himalaya', 'labrador', 'tierra del fuego']
Original order:
['himalaya', 'andes', 'tierra del fuego', 'labrador', 'guam']
Reverse alphabetical:
['tierra del fuego', 'labrador', 'himalaya', 'guam', 'andes']
Original order:
['himalaya', 'andes', 'tierra del fuego', 'labrador', 'guam']
Reversed:
['guam', 'labrador', 'tierra del fuego', 'andes', 'himalaya']
Original order:
['himalaya', 'andes', 'tierra del fuego', 'labrador', 'guam']
Alphabetical
['andes', 'guam', 'himalaya', 'labrador', 'tierra del fuego']
Reverse alphabetical
['tierra del fuego', 'labrador', 'himalaya', 'guam', 'andes']
3-9 晚餐嘉賓 :在完成練習3-4~練習3-7時編寫的程式之一中,使用len() 列印一條消息,指出你邀請了多少位嘉賓來與你共進晚餐。
3-10 嘗試使用各個函數 :想想可存儲到清單中的東西,如山嶽、河流、國家、城市、語言或你喜歡的任何東西。編寫一個程式,在其中創建一個包含這些元素的清單,然後,對於本章介紹的每個函數,都至少使用一次來處理這個列表。
3.4 使用清單時避免索引錯誤
剛開始使用清單時,經常會遇到一種錯誤。假設你有一個包含三個元素的清單,卻要求獲取第四個元素:
motorcycles
= ['honda', 'yamaha', 'suzuki']
print(motorcycles[3])
這將導致索引錯誤 :
Traceback
(most recent call last):
File "motorcycles.py", line 3, in
<module>
print(motorcycles[3])
IndexError:
list index out of range
Python試圖向你提供位於索引3處的元素,但它搜索清單motorcycles 時,卻發現索引3處沒有元素。鑒於清單索引差一的特徵,這種錯誤很常見。有些人從1開始數,因此以為第三個元素的索引為3;但在Python中,第三個元素的索引為2,因為索引是從0開始的。
索引錯誤意味著Python無法理解你指定的索引。程式發生索引錯誤時,請嘗試將你指定的索引減1,然後再次運行程式,看看結果是否正確。
別忘了,每當需要訪問最後一個清單元素時,都可使用索引-1 。這在任何情況下都行之有效,即便你最後一次訪問列表後,其長度發生了變化:
motorcycles
= ['honda', 'yamaha', 'suzuki']
print(motorcycles[-1])
索引-1 總是返回最後一個清單元素,這裡為值'suzuki' :
'suzuki'
僅當列表為空時,這種訪問最後一個元素的方式才會導致錯誤:
motorcycles
= []
print(motorcycles[-1])
清單motorcycles 不包含任何元素,因此Python返回一條索引錯誤消息:
Traceback
(most recent call last):
File "motorcyles.py", line 3, in
<module>
print(motorcycles[-1])
IndexError:
list index out of range
注意 發生索引錯誤卻找不到解決辦法時,請嘗試將列表或其長度列印出來。清單可能與你以為的截然不同,在程式對其進行了動態處理時尤其如此。通過查看列表或其包含的元素數,可説明你找出這種邏輯錯誤。
動手試一試
3-11 有意引發錯誤 :如果你還沒有在程式中遇到過索引錯誤,就嘗試引發一個這種錯誤。在你的一個程式中,修改其中的索引,以引發索引錯誤。關閉程式前,務必消除這個錯誤。
3.5 小結
在本章中,你學習了:清單是什麼以及如何使用其中的元素;如何定義清單以及如何增刪元素;如何對列表進行永久性排序,以及如何為展示列表而進行臨時排序;如何確定列表的長度,以及在使用清單時如何避免索引錯誤。
在第4章,你將學習如何以更高效的方式處理清單元素。通過使用為數不多的幾行代碼來遍歷清單元素,你就能高效地處理它們,即便列表包含數千乃至數百萬個元素。


0 留言:
發佈留言