3.1 列表是什么
列表
由一系列按特定順序排列的元素組成。
可以創建包含字母表中所有字母、數字0~9或所有家庭成員姓名的列表;也可以將任何東西加入列表中,其中的元素之間可以沒有任何關系。
鑒于列表通常包含多個元素,可以給列表指定一個表示復數的名稱(如letters 、digits 或names )。
在Python中,用方括號([])來表示列表,并用逗號來分隔其中的元素。
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles)
['trek', 'cannondale', 'redline', 'specialized']
3.1.1 訪問列表元素
列表是 有序集合 ,因此要訪問列表的任何元素,只需將該元素的位置或索引告訴Python即可。要訪問列表元素,可指出列表的名稱,再指出元素的索引,并將其放在方括號內。
注意:這里的索引從0開始
還可以對任何列表元素調用之前介紹的字符串方法。
print(bicycles[0])
trek
print(bicycles[1].title())
Cannondale
3.1.2 索引從0而不是1開始
Python為訪問最后一個列表元素提供了一種特殊語法。通過將索引指定為-1。可以在不知道列表長度的情況下訪問最后的元素。
print(bicycles[-1])
specialized
3.1.3 使用列表中的各個值
可像使用其他變量一樣使用列表中的各個值。
練習:
3-1 姓名:將一些朋友的姓名存儲在一個列表中,并將其命名為names 。依次訪問該列表中的每個元素,從而將每個朋友的姓名都打印出來。
3-2 問候語:繼續使用練習3-1中的列表,但不打印每個朋友的姓名,而為每人打印一條消息。每條消息都包含相同的問候語,但抬頭為相應朋友的姓名。
3-3 自己的列表:想想你喜歡的通勤方式,如騎摩托車或開汽車,并創建一個包含多種通勤方式的列表。根據該列表打印一系列有關這些通勤方式的宣言,如“I would like to own a Honda motorcycle”。
# 3-1 這里用到了循環,后面再講
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 修改列表元素
修改列表元素的語法與訪問列表元素的語法類似。要修改列表元素,可指定列表名和要修改的元素的索引,再指定該元素的新值。
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']
可以先創建一個空列表,再使用一系列的append() 語句添加元素。
motorcycles = []
motorcycles.append('honda')
motorcycles.append('yamaha')
motorcycles.append('suzuki')
print(motorcycles)
['honda', 'yamaha', 'suzuki']
- 在列表中插入元素
使用方法insert()可在列表的任何位置添加新元素。為此,需要指定新元素的索引和值。這種操作將列表中既有的每個元素都右移一個位置。
motorcycles = ['honda', 'yamaha', 'suzuki']
motorcycles.insert(2, 'ducati')
print(motorcycles)
['honda', 'yamaha', 'ducati', 'suzuki']
3.2.3 從列表中刪除元素
- 使用del 語句刪除元素
如果知道要刪除的元素在列表中的位置,可使用del 語句。使用del可刪除任何位置處的列表元素,條件是知道其索引。
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
del motorcycles[0]
print(motorcycles)
['honda', 'yamaha', 'suzuki']
['yamaha', 'suzuki']
- 使用方法pop() 刪除元素
方法pop()可刪除列表末尾的元素,并讓你能夠接著使用它。列表就像一個棧,而刪除列表末尾的元素相當于彈出棧頂元素。
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
popped_motorcycle = motorcycles.pop()
print(motorcycles)
print(popped_motorcycle)
['honda', 'yamaha', 'suzuki']
['honda', 'yamaha']
suzuki
- 彈出列表中任何位置處的元素
可以使用pop()來刪除列表中任何位置的元素,只需在括號中指定要刪除的元素的索引即可。
如果不確定該使用del語句還是pop()方法,下面是一個簡單的判斷標準:如果你要從列表中刪除一個元素,且不再以任何方式使用它,就使用del語句;如果你要在刪除元素后還能繼續使用它,就使用方法pop()。
motorcycles = ['honda', 'yamaha', 'suzuki']
first_owned = motorcycles.pop(0)
print(motorcycles)
print(first_owned)
['yamaha', 'suzuki']
honda
- 根據值刪除元素
當不知道要從列表中刪除的值所處的位置。如果你只知道要刪除的元素的值,可使用方法remove() 。
方法remove()只刪除第一個指定的值。如果要刪除的值可能在列表中出現多次,就需要使用循環來判斷是否刪除了所有這樣的值。
motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']
print(motorcycles)
motorcycles.remove('suzuki')
print(motorcycles)
['honda', 'yamaha', 'suzuki', 'ducati']
['honda', 'yamaha', 'ducati']
練習:
3-4 嘉賓名單 :如果你可以邀請任何人一起共進晚餐(無論是在世的還是故去的),你會邀請哪些人?請創建一個列表,其中包含至少3個你想邀請的人;然后,使用這個列表打印消息,邀請這些人來與你共進晚餐。
3-5 修改嘉賓名單 :你剛得知有位嘉賓無法赴約,因此需要另外邀請一位嘉賓。
以完成練習3-4時編寫的程序為基礎,在程序末尾添加一條print 語句,指出哪位嘉賓無法赴約。
修改嘉賓名單,將無法赴約的嘉賓的姓名替換為新邀請的嘉賓的姓名。
再次打印一系列消息,向名單中的每位嘉賓發出邀請。
3-6 添加嘉賓 :你剛找到了一個更大的餐桌,可容納更多的嘉賓。請想想你還想邀請哪三位嘉賓。
以完成練習3-4或練習3-5時編寫的程序為基礎,在程序末尾添加一條print 語句,指出你找到了一個更大的餐桌。
使用insert() 將一位新嘉賓添加到名單開頭。
使用insert() 將另一位新嘉賓添加到名單中間。
使用append() 將最后一位新嘉賓添加到名單末尾。
打印一系列消息,向名單中的每位嘉賓發出邀請。
3-7 縮減名單 :你剛得知新購買的餐桌無法及時送達,因此只能邀請兩位嘉賓。
以完成練習3-6時編寫的程序為基礎,在程序末尾添加一行代碼,打印一條你只能邀請兩位嘉賓共進晚餐的消息。
使用pop() 不斷地刪除名單中的嘉賓,直到只有兩位嘉賓為止。每次從名單中彈出一位嘉賓時,都打印一條消息,讓該嘉賓知悉你很抱歉,無法邀請他來共進晚餐。
對于余下的兩位嘉賓中的每一位,都打印一條消息,指出他依然在受邀人之列。
使用del 將最后兩位嘉賓從名單中刪除,讓名單變成空的。打印該名單,核實程序結束時名單確實是空的。
# 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() 對列表進行永久性排序
方法sort() 永久性修改了列表元素的排列順序,再也無法恢復到原來的排列順序。還可以按與字母順序相反的順序排列列表元素,為此,只需向sort() 方法傳遞參數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 使用函數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 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 倒著打印列表
要反轉列表元素的排列順序,可使用方法reverse()。方法reverse() 永久性地修改列表元素的排列順序,但可隨時恢復到原來的排列順序,為此只需對列表再次調用reverse() 即可。
cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.reverse()
print(cars)
['subaru', 'toyota', 'audi', 'bmw']
3.3.4 確定列表的長度
使用函數len() 可快速獲悉列表的長度。
print(len(cars))
4
練習: 3-8 放眼世界 :想出至少5個你渴望去旅游的地方。
將這些地方存儲在一個列表中,并確保其中的元素不是按字母順序排列的。
按原始排列順序打印該列表。不要考慮輸出是否整潔的問題,只管打印原始Python列表。
使用sorted() 按字母順序打印這個列表,同時不要修改它。
再次打印該列表,核實排列順序未變。
使用sorted() 按與字母順序相反的順序打印這個列表,同時不要修改它。
再次打印該列表,核實排列順序未變。
使用reverse() 修改列表元素的排列順序。打印該列表,核實排列順序確實變了。
使用reverse() 再次修改列表元素的排列順序。打印該列表,核實已恢復到原來的排列順序。
使用sort() 修改該列表,使其元素按字母順序排列。打印該列表,核實排列順序確實變了。
使用sort() 修改該列表,使其元素按與字母順序相反的順序排列。打印該列表,核實排列順序確實變了。
3-9 晚餐嘉賓 :在完成練習3-4~練習3-7時編寫的程序之一中,使用len() 打印一條消息,指出你邀請了多少位嘉賓來與你共進晚餐。
3-10 嘗試使用各個函數 :想想可存儲到列表中的東西,如山岳、河流、國家、城市、語言或你喜歡的任何東西。編寫一個程序,在其中創建一個包含這些元素的列表,然后,對于本章介紹的每個函數,都至少使用一次來處理這個列表。
# 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 使用列表時避免索引錯誤
僅當列表為空時,這種訪問最后一個元素的方式才會導致錯誤。
發生索引錯誤卻找不到解決辦法時,可嘗試將列表或其長度打印出來。列表可能與你以為的截然不同,在程序對其進行了動態處理時尤其如此。通過查看列表或其包含的元素數,可幫助你找出這種邏輯錯誤。
%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
評論
查看更多