3.1 列表是什么
列表
由一系列按特定順序排列的元素組成。
可以創(chuàng)建包含字母表中所有字母、數(shù)字0~9或所有家庭成員姓名的列表;也可以將任何東西加入列表中,其中的元素之間可以沒(méi)有任何關(guān)系。
鑒于列表通常包含多個(gè)元素,可以給列表指定一個(gè)表示復(fù)數(shù)的名稱(如letters 、digits 或names )。
在Python中,用方括號(hào)([])來(lái)表示列表,并用逗號(hào)來(lái)分隔其中的元素。
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles)
['trek', 'cannondale', 'redline', 'specialized']
3.1.1 訪問(wèn)列表元素
列表是 有序集合 ,因此要訪問(wèn)列表的任何元素,只需將該元素的位置或索引告訴Python即可。要訪問(wèn)列表元素,可指出列表的名稱,再指出元素的索引,并將其放在方括號(hào)內(nèi)。
注意:這里的索引從0開(kāi)始
還可以對(duì)任何列表元素調(diào)用之前介紹的字符串方法。
print(bicycles[0])
trek
print(bicycles[1].title())
Cannondale
3.1.2 索引從0而不是1開(kāi)始
Python為訪問(wèn)最后一個(gè)列表元素提供了一種特殊語(yǔ)法。通過(guò)將索引指定為-1。可以在不知道列表長(zhǎng)度的情況下訪問(wèn)最后的元素。
print(bicycles[-1])
specialized
3.1.3 使用列表中的各個(gè)值
可像使用其他變量一樣使用列表中的各個(gè)值。
練習(xí):
3-1 姓名:將一些朋友的姓名存儲(chǔ)在一個(gè)列表中,并將其命名為names 。依次訪問(wèn)該列表中的每個(gè)元素,從而將每個(gè)朋友的姓名都打印出來(lái)。
3-2 問(wèn)候語(yǔ):繼續(xù)使用練習(xí)3-1中的列表,但不打印每個(gè)朋友的姓名,而為每人打印一條消息。每條消息都包含相同的問(wèn)候語(yǔ),但抬頭為相應(yīng)朋友的姓名。
3-3 自己的列表:想想你喜歡的通勤方式,如騎摩托車或開(kāi)汽車,并創(chuàng)建一個(gè)包含多種通勤方式的列表。根據(jù)該列表打印一系列有關(guān)這些通勤方式的宣言,如“I would like to own a Honda motorcycle”。
# 3-1 這里用到了循環(huán),后面再講
names = ['Su Hai', 'Yang Ling', 'Mike', 'Helen']
for i in range(len(names)):
print(names[i])
# 3-2
for i in range(len(names)):
print('{}, Nice to meet you.'.format(names[i]))
# 3-3
traffic_type = ['ship', 'train', 'bicycle', 'aeroplane']
for i in range(len(traffic_type)):
print('I would like to get to your home by {}.'.format(traffic_type[i]))
Su Hai
Yang Ling
Mike
Helen
Su Hai, Nice to meet you.
Yang Ling, Nice to meet you.
Mike, Nice to meet you.
Helen, Nice to meet you.
I would like to get to your home by ship.
I would like to get to your home by train.
I would like to get to your home by bicycle.
I would like to get to your home by aeroplane.
3.2 修改、添加和刪除元素
3.2.1 修改列表元素
修改列表元素的語(yǔ)法與訪問(wèn)列表元素的語(yǔ)法類似。要修改列表元素,可指定列表名和要修改的元素的索引,再指定該元素的新值。
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
motorcycles[0] = 'ducati'
print(motorcycles)
motorcycles[1] = 'dayang'
print(motorcycles)
['honda', 'yamaha', 'suzuki']
['ducati', 'yamaha', 'suzuki']
['ducati', 'dayang', 'suzuki']
3.2.2 在列表中添加元素
- 在列表末尾添加元素
append()方法將元素'ducati'添加到了列表末尾,而不影響列表中的其他所有元素。
motorcycles.append('universe')
print(motorcycles)
['ducati', 'dayang', 'suzuki', 'universe']
可以先創(chuàng)建一個(gè)空列表,再使用一系列的append() 語(yǔ)句添加元素。
motorcycles = []
motorcycles.append('honda')
motorcycles.append('yamaha')
motorcycles.append('suzuki')
print(motorcycles)
['honda', 'yamaha', 'suzuki']
- 在列表中插入元素
使用方法insert()可在列表的任何位置添加新元素。為此,需要指定新元素的索引和值。這種操作將列表中既有的每個(gè)元素都右移一個(gè)位置。
motorcycles = ['honda', 'yamaha', 'suzuki']
motorcycles.insert(2, 'ducati')
print(motorcycles)
['honda', 'yamaha', 'ducati', 'suzuki']
3.2.3 從列表中刪除元素
- 使用del 語(yǔ)句刪除元素
如果知道要?jiǎng)h除的元素在列表中的位置,可使用del 語(yǔ)句。使用del可刪除任何位置處的列表元素,條件是知道其索引。
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
del motorcycles[0]
print(motorcycles)
['honda', 'yamaha', 'suzuki']
['yamaha', 'suzuki']
- 使用方法pop() 刪除元素
方法pop()可刪除列表末尾的元素,并讓你能夠接著使用它。列表就像一個(gè)棧,而刪除列表末尾的元素相當(dāng)于彈出棧頂元素。
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
popped_motorcycle = motorcycles.pop()
print(motorcycles)
print(popped_motorcycle)
['honda', 'yamaha', 'suzuki']
['honda', 'yamaha']
suzuki
- 彈出列表中任何位置處的元素
可以使用pop()來(lái)刪除列表中任何位置的元素,只需在括號(hào)中指定要?jiǎng)h除的元素的索引即可。
如果不確定該使用del語(yǔ)句還是pop()方法,下面是一個(gè)簡(jiǎn)單的判斷標(biāo)準(zhǔn):如果你要從列表中刪除一個(gè)元素,且不再以任何方式使用它,就使用del語(yǔ)句;如果你要在刪除元素后還能繼續(xù)使用它,就使用方法pop()。
motorcycles = ['honda', 'yamaha', 'suzuki']
first_owned = motorcycles.pop(0)
print(motorcycles)
print(first_owned)
['yamaha', 'suzuki']
honda
- 根據(jù)值刪除元素
當(dāng)不知道要從列表中刪除的值所處的位置。如果你只知道要?jiǎng)h除的元素的值,可使用方法remove() 。
方法remove()只刪除第一個(gè)指定的值。如果要?jiǎng)h除的值可能在列表中出現(xiàn)多次,就需要使用循環(huán)來(lái)判斷是否刪除了所有這樣的值。
motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']
print(motorcycles)
motorcycles.remove('suzuki')
print(motorcycles)
['honda', 'yamaha', 'suzuki', 'ducati']
['honda', 'yamaha', 'ducati']
練習(xí):
3-4 嘉賓名單 :如果你可以邀請(qǐng)任何人一起共進(jìn)晚餐(無(wú)論是在世的還是故去的),你會(huì)邀請(qǐng)哪些人?請(qǐng)創(chuàng)建一個(gè)列表,其中包含至少3個(gè)你想邀請(qǐng)的人;然后,使用這個(gè)列表打印消息,邀請(qǐng)這些人來(lái)與你共進(jìn)晚餐。
3-5 修改嘉賓名單 :你剛得知有位嘉賓無(wú)法赴約,因此需要另外邀請(qǐng)一位嘉賓。
以完成練習(xí)3-4時(shí)編寫(xiě)的程序?yàn)榛A(chǔ),在程序末尾添加一條print 語(yǔ)句,指出哪位嘉賓無(wú)法赴約。
修改嘉賓名單,將無(wú)法赴約的嘉賓的姓名替換為新邀請(qǐng)的嘉賓的姓名。
再次打印一系列消息,向名單中的每位嘉賓發(fā)出邀請(qǐng)。
3-6 添加嘉賓 :你剛找到了一個(gè)更大的餐桌,可容納更多的嘉賓。請(qǐng)想想你還想邀請(qǐng)哪三位嘉賓。
以完成練習(xí)3-4或練習(xí)3-5時(shí)編寫(xiě)的程序?yàn)榛A(chǔ),在程序末尾添加一條print 語(yǔ)句,指出你找到了一個(gè)更大的餐桌。
使用insert() 將一位新嘉賓添加到名單開(kāi)頭。
使用insert() 將另一位新嘉賓添加到名單中間。
使用append() 將最后一位新嘉賓添加到名單末尾。
打印一系列消息,向名單中的每位嘉賓發(fā)出邀請(qǐng)。
3-7 縮減名單 :你剛得知新購(gòu)買的餐桌無(wú)法及時(shí)送達(dá),因此只能邀請(qǐng)兩位嘉賓。
以完成練習(xí)3-6時(shí)編寫(xiě)的程序?yàn)榛A(chǔ),在程序末尾添加一行代碼,打印一條你只能邀請(qǐng)兩位嘉賓共進(jìn)晚餐的消息。
使用pop() 不斷地刪除名單中的嘉賓,直到只有兩位嘉賓為止。每次從名單中彈出一位嘉賓時(shí),都打印一條消息,讓該嘉賓知悉你很抱歉,無(wú)法邀請(qǐng)他來(lái)共進(jìn)晚餐。
對(duì)于余下的兩位嘉賓中的每一位,都打印一條消息,指出他依然在受邀人之列。
使用del 將最后兩位嘉賓從名單中刪除,讓名單變成空的。打印該名單,核實(shí)程序結(jié)束時(shí)名單確實(shí)是空的。
# 3-4
print('-------------------')
guests = ['Guest1','Guest2','Guest3','Guest4']
for i in range(len(guests)):
print('Invation to {}'.format(guests[i]))
# 3-5
print('-------------------')
unattended_guest = guests.pop(2)
print(unattended_guest)
guests.append('Guest5')
for i in range(len(guests)):
print('Invation to {}'.format(guests[i]))
# 3-6
print('-------------------')
guests.insert(0,'Guest6')
guests.insert(int(len(guests)/2),'Guest7')
guests.append('Guest8')
for i in range(len(guests)):
print('Invation to {}'.format(guests[i]))
# 3-8
print('-------------------')
for i in range(len(guests)-2):
print('Sorry to {}'.format(guests.pop()))
for i in range(len(guests)):
print('Invation to {}'.format(guests[0]))
del guests[0]
print(len(guests))
-------------------
Invation to Guest1
Invation to Guest2
Invation to Guest3
Invation to Guest4
-------------------
Guest3
Invation to Guest1
Invation to Guest2
Invation to Guest4
Invation to Guest5
-------------------
Invation to Guest6
Invation to Guest1
Invation to Guest7
Invation to Guest2
Invation to Guest4
Invation to Guest5
Invation to Guest8
-------------------
Sorry to Guest8
Sorry to Guest5
Sorry to Guest4
Sorry to Guest2
Sorry to Guest7
Invation to Guest6
Invation to Guest1
0
3.3 組織列表
3.3.1 使用方法sort() 對(duì)列表進(jìn)行永久性排序
方法sort() 永久性修改了列表元素的排列順序,再也無(wú)法恢復(fù)到原來(lái)的排列順序。還可以按與字母順序相反的順序排列列表元素,為此,只需向sort() 方法傳遞參數(shù)reverse=True 。
cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.sort()
print(cars)
['audi', 'bmw', 'subaru', 'toyota']
cars.sort(reverse=True)
print(cars)
['toyota', 'subaru', 'bmw', 'audi']
3.3.2 使用函數(shù)sorted() 對(duì)列表進(jìn)行臨時(shí)排序
要保留列表元素原來(lái)的排列順序,同時(shí)以特定的順序呈現(xiàn)它們,可使用函數(shù)sorted()。函數(shù)sorted()讓你能夠按特定順序顯示列表元素,同時(shí)不影響它們?cè)诹斜碇械脑寂帕许樞颉?/p>
在并非所有的值都是小寫(xiě)時(shí),按字母順序排列列表要復(fù)雜些。決定排列順序時(shí),有多種解讀大寫(xiě)字母的方式,要指定準(zhǔn)確的排列順序,可能要復(fù)雜一些。
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 reverse sorted list:")
print(sorted(cars,reverse=True))
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 reverse sorted list:
['toyota', 'subaru', 'bmw', 'audi']
Here is the original list again:
['bmw', 'audi', 'toyota', 'subaru']
3.3.3 倒著打印列表
要反轉(zhuǎn)列表元素的排列順序,可使用方法reverse()。方法reverse() 永久性地修改列表元素的排列順序,但可隨時(shí)恢復(fù)到原來(lái)的排列順序,為此只需對(duì)列表再次調(diào)用reverse() 即可。
cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.reverse()
print(cars)
['subaru', 'toyota', 'audi', 'bmw']
3.3.4 確定列表的長(zhǎng)度
使用函數(shù)len() 可快速獲悉列表的長(zhǎng)度。
print(len(cars))
4
練習(xí): 3-8 放眼世界 :想出至少5個(gè)你渴望去旅游的地方。
將這些地方存儲(chǔ)在一個(gè)列表中,并確保其中的元素不是按字母順序排列的。
按原始排列順序打印該列表。不要考慮輸出是否整潔的問(wèn)題,只管打印原始Python列表。
使用sorted() 按字母順序打印這個(gè)列表,同時(shí)不要修改它。
再次打印該列表,核實(shí)排列順序未變。
使用sorted() 按與字母順序相反的順序打印這個(gè)列表,同時(shí)不要修改它。
再次打印該列表,核實(shí)排列順序未變。
使用reverse() 修改列表元素的排列順序。打印該列表,核實(shí)排列順序確實(shí)變了。
使用reverse() 再次修改列表元素的排列順序。打印該列表,核實(shí)已恢復(fù)到原來(lái)的排列順序。
使用sort() 修改該列表,使其元素按字母順序排列。打印該列表,核實(shí)排列順序確實(shí)變了。
使用sort() 修改該列表,使其元素按與字母順序相反的順序排列。打印該列表,核實(shí)排列順序確實(shí)變了。
3-9 晚餐嘉賓 :在完成練習(xí)3-4~練習(xí)3-7時(shí)編寫(xiě)的程序之一中,使用len() 打印一條消息,指出你邀請(qǐng)了多少位嘉賓來(lái)與你共進(jìn)晚餐。
3-10 嘗試使用各個(gè)函數(shù) :想想可存儲(chǔ)到列表中的東西,如山岳、河流、國(guó)家、城市、語(yǔ)言或你喜歡的任何東西。編寫(xiě)一個(gè)程序,在其中創(chuàng)建一個(gè)包含這些元素的列表,然后,對(duì)于本章介紹的每個(gè)函數(shù),都至少使用一次來(lái)處理這個(gè)列表。
# 3-8
places = ['nantong','beijing','shanghai','nanjing','hangzhou']
print(places)
print(sorted(places))
print(places)
print(sorted(places,reverse=True))
print(places)
places.reverse()
print(places)
places.reverse()
print(places)
places.sort()
print(places)
places.sort(reverse=True)
print(places)
# 3-9
print(len(places))
['nantong', 'beijing', 'shanghai', 'nanjing', 'hangzhou']
['beijing', 'hangzhou', 'nanjing', 'nantong', 'shanghai']
['nantong', 'beijing', 'shanghai', 'nanjing', 'hangzhou']
['shanghai', 'nantong', 'nanjing', 'hangzhou', 'beijing']
['nantong', 'beijing', 'shanghai', 'nanjing', 'hangzhou']
['hangzhou', 'nanjing', 'shanghai', 'beijing', 'nantong']
['nantong', 'beijing', 'shanghai', 'nanjing', 'hangzhou']
['beijing', 'hangzhou', 'nanjing', 'nantong', 'shanghai']
['shanghai', 'nantong', 'nanjing', 'hangzhou', 'beijing']
5
3.4 使用列表時(shí)避免索引錯(cuò)誤
僅當(dāng)列表為空時(shí),這種訪問(wèn)最后一個(gè)元素的方式才會(huì)導(dǎo)致錯(cuò)誤。
發(fā)生索引錯(cuò)誤卻找不到解決辦法時(shí),可嘗試將列表或其長(zhǎng)度打印出來(lái)。列表可能與你以為的截然不同,在程序?qū)ζ溥M(jìn)行了動(dòng)態(tài)處理時(shí)尤其如此。通過(guò)查看列表或其包含的元素?cái)?shù),可幫助你找出這種邏輯錯(cuò)誤。
%debug
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles[-1])
print(motorcycles[3])
> < ipython-input-21-8306d8c0082f >(4)< module >()
1 get_ipython().magic('debug')
2 motorcycles = ['honda', 'yamaha', 'suzuki']
3 print(motorcycles[-1])
---- > 4 print(motorcycles[3])
ipdb > len(motorcycles)
3
ipdb > quit
suzuki
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
< ipython-input-22-8306d8c0082f > in < module >()
2 motorcycles = ['honda', 'yamaha', 'suzuki']
3 print(motorcycles[-1])
---- > 4 print(motorcycles[3])
IndexError: list index out of range
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
< ipython-input-22-8306d8c0082f > in < module >()
2 motorcycles = ['honda', 'yamaha', 'suzuki']
3 print(motorcycles[-1])
---- > 4 print(motorcycles[3])
IndexError: list index out of range
motorcycles = []
print(motorcycles[-1])
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
< ipython-input-23-08e14d7d6f1a > in < module >()
1 motorcycles = []
---- > 2 print(motorcycles[-1])
IndexError: list index out of range
評(píng)論