列表簡介
#修改,添加,刪除列表元素? #a = 1;b=2;c=3;? #print(a*b,b*c);前面遺留的問題
#你創(chuàng)建的大多數(shù)列表將是動態(tài)的,意味著創(chuàng)建列表后,將隨著程序運行增刪元素。
#比如,創(chuàng)建一個游戲,玩家射殺從天而降的外星人。為此,可在開始時將一些外星人存儲在列表中,
#然后每當(dāng)外星人被射殺時,都將其從列表中刪除,而每當(dāng)有新的外星人出現(xiàn)在屏幕上時,都將其添加到列表中。
#在整個游戲運行期間,外星人列表的長度將不斷變化。
##修改列表元素##
###修改列表元素,可指定列表名和要修改的元素索引,再指定該元素的新值。###
motorcycles = ['honda','yamaha','suzuki'];
print(motorcycles);? ? ? ? ? #['honda', 'yamaha', 'suzuki']
# 修改列表元素 #
motorcycles[0] = 'ducati';
print(motorcycles);? ? ? ? ? #['ducati', 'yamaha', 'suzuki']
#你可以修改任何列表元素的值,而不僅僅是第一個元素的值
##在列表中添加元素##
#列如,你希望游戲中出現(xiàn)新的外星人,添加可視化數(shù)據(jù)或給網(wǎng)站添加新注冊的用戶。
#python提供了多種在既有列表中添加新數(shù)據(jù)的方式
###在列表末尾添加元素###
#在列表末尾添加元素時,最簡單的方式是,將元素附加到列表。給列表附加元素時,它將添加到列表末尾。
motorcycles = ['honda','yamaha','suzuki'];
print(motorcycles);? ?#['honda', 'yamaha', 'suzuki']
motorcycles.append('xiaoying');
print(motorcycles);? ?#['honda', 'yamaha', 'suzuki', 'xiaoying']
#方法append()將元素'xiaoying'添加到列表末尾,而不會影響列表中的其他所有元素。
##方法append()讓動態(tài)地創(chuàng)建列表易如反掌。##
#例如,你可以創(chuàng)建一個空列表,在使用一系列函數(shù)調(diào)用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 = ['honda','yamaha','suzuki'];
motorcycles.insert(0,'xiaoying');
motorcycles.insert(3,'XY',);
print(motorcycles);? ? ? ? ?#['xiaoying', 'honda', 'yamaha', 'XY', 'suzuki']
##這個示例中,值'xiaoying'和值'XY'被插入到列表開頭和倒數(shù)第二。方法insert()在索引0和3處添加空間,
##并將值'xiaoying'和值'XY'存儲到這個地方。
#這種操作將列表中的既有的每個元素都向右移一個位置。
###注意,列表插入后索引就會更新###
motorcycles = ['honda','yamaha','suzuki'];
motorcycles.insert(3,'xiaoying');
print(motorcycles);? ? ? ? ?#['honda', 'yamaha', 'suzuki', 'xiaoying']
motorcycles.insert(4,'bycycle');
print(motorcycles);? ? ? ? ?#['honda', 'yamaha', 'suzuki', 'xiaoying', 'bycycle']
##從列表中刪除元素##
#經(jīng)常需要刪除列表中的一個或多個元素。例如,玩家將空中的一個外星人射殺后,
#你可能需要將其從存活的外星人列表中刪除。當(dāng)用戶在你創(chuàng)建的web應(yīng)用中注銷賬戶時,
#你就需要將該用戶從活動用戶列表中刪除。你可以根據(jù)位置或值來刪除列表中的元素。
###使用del語句永久刪除元素###
motorcycles = ['honda','yamaha','suzuki'];
print(motorcycles);? ?#['honda', 'yamaha', 'suzuki']
del motorcycles[1];
print(motorcycles);? ?#['honda', 'suzuki']這里刪除了索引為1的元素'yamaha'
###del可以刪除任意位置處的列表元素,條件是知道其索引,
#并且是永久刪除,無法再訪問它(也就是值刪除的元素哦)###
print(motorcycles[1]);? ?#suzuki
#使用方法pop()刪除元素
#有時候,你需要將元素從列表中刪除,并接著使用它的值,例如,你可能需要獲取剛被擊殺的外星人的x和y的坐標(biāo),
#以便在相同位置顯示爆炸效果,在web應(yīng)用程序中,你可能要將用戶從活躍成員列表中刪除,
#并將其加入到非活躍成員列表中。
#方法pop()刪除列表末尾的元素,并讓你能夠接著使用它。術(shù)語彈出pop()源自這樣的類比,列表就像一個棧,
#而刪除列表末尾的元素相當(dāng)于彈出棧頂元素。
#從列表motorcycle中彈出一款摩托車
#定義并打印列表motorcycles
motorcycles = ['honda','yamaha','suzuki']
print(motorcycles) #['honda', 'yamaha', 'suzuki']
#從這個列表中彈出一個值,并將其賦給變量popped_motorcycle中,然后打印這個列表,以核實從中刪除了一個值。
#最后打印彈出的值,以證明我們依然能訪問被刪除的值
popped_motorcycle = motorcycles.pop()
print(motorcycles)? ? ? ? ?#['honda', 'yamaha']
print(popped_motorcycle)? ?#suzuki
#輸出表明,列表末尾的值'suzuki'已刪除,它現(xiàn)在被賦給了變量popped_motorcycle
#方法pop()有什么用呢?假設(shè)列表中的摩托車是按購買的時間存儲的,就可以使用pop()打印一條消息,
#指出最后購買的是哪款摩托車
motorcycles = ['honda','yamaha','suzuki']
last_owned = motorcycles.pop()
print(f"The last motorcycle I owned was a {last_owned.title()}.")? #The last motorcycle I owned was a Suzuki.
##彈出列表中任意位置處的元素##
#實際上,可以使用pop()來刪除任意位置的元素,只需要在圓括號中指定要刪除元素的索引即可
motorcycles = ['honda','yamaha','suzuki']
last_owned = motorcycles.pop(1)
print(f"The last motorcycle I owned was a {last_owned.title()}.")? ?#The last motorcycle I owned was a Yamaha.
#但是別忘了,每當(dāng)你使用pop()時,被彈出的元素就不在列表中了
#總結(jié),del語句刪除的元素就不能再訪問了,方法pop()刪除元素后還能繼續(xù)使用它
###根據(jù)值刪除元素###
#有時候,不知道要刪除的值在列表中的位置,如果只知道要刪除元素的值,可以使用方法remove()
motorcycles = ['honda','yamaha','suzuki','ducati']
print(motorcycles)? ?#['honda', 'yamaha', 'suzuki', 'ducati']
#假設(shè)從列表motorcycles中刪除值'ducati'
motorcycles.remove('ducati')
print(motorcycles)? ?#['honda', 'yamaha', 'suzuki']
#使用方法remove()從列表中刪除元素,也可以繼續(xù)使用它。
#打印刪除值'ducati'并打印一條消息,指出從列表中將其刪除的原因
motorcycles = ['honda','yamaha','suzuki','ducati']
print(motorcycles)
#將值'ducati'賦給變量too_expensive
too_expensive = 'ducati'
motorcycles.remove(too_expensive)
print(motorcycles)
print(f"\nA {too_expensive.title()} is too expensive for me")? ?#A Ducati is too expensive for me
#方法remove()只能刪除第一個指定的值,如果要刪除的值在列表中出現(xiàn)多次,就需要使用循環(huán)來確保每個值都刪除
motorcycles = ['honda','yamaha','ducati','suzuki','ducati']
print(motorcycles)? ? ? ?#['honda', 'yamaha', 'ducati', 'suzuki', 'ducati']
too_expensive = 'ducati'
motorcycles.remove(too_expensive)
print(motorcycles)? ? ? ?#['honda', 'yamaha', 'suzuki', 'ducati']
###組織列表###
#創(chuàng)建的列表中,元素排列順序常常是無法預(yù)測的,因為你并非總能控制用戶提供數(shù)據(jù)的順序。
#有時候,你希望保留列表元素最初的排列順序,而有時候你又需要調(diào)整排列順序
###使用方法sort()對列表永久排序###
#假設(shè)讓汽車列表按字母順序排列,為簡化這項任務(wù),假設(shè)列表中使用值都是小寫的
##建立一個cars.py文件(其他文件自己取名,后面不再演示)
cars = ['bmw','audi','toyota','subaru']
cars.sort()
print(cars)? ?#['audi', 'bmw', 'subaru', 'toyota']
#方法sort()永久性地修改列表元素的排列順序?,F(xiàn)在汽車按字母順序排列,再也無法恢復(fù)到原來的排列順序
###還可以按與字母相反的順序排列列表元素,只需向sort()方法傳遞參數(shù)reverse=True即可,同樣也是永久性地修改
cars = ['bmw','audi','toyota','subaru']
cars.sort(reverse=True)
print(cars)? ?#['audi', 'bmw', 'subaru', 'toyota']? ?#['toyota', 'subaru', 'bmw', 'audi']
##使用函數(shù)sorted()對列表臨時排序##
#保留列表元素原來的排列順序,同時以特定順序呈現(xiàn)它們,不會影響列表中的原始排列順序,可使用函數(shù)sorted()
cars = ['bmw','audi','toyota','subaru']
print('Here is the original list:')
print(cars)
print('Here is the sorted list:')
print(sorted(cars))
print('Here 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']
'''
##首先按原始打印順序打印列表,再按字母順序顯示列表,以特定順序顯示列表后,
##最后確認(rèn)列表元素的排列順序與以前相同
###當(dāng)然也可以按與字母相反順序顯示列表,[也就是傳遞參數(shù)reverse=True],print(sorted(cars,reverse=True))###
#當(dāng)然并非所有的值都是小寫的,按字母順序排列列表要復(fù)雜些,決定排列順序時,有多種解讀大寫字母的方式
#要指定準(zhǔn)確的排列順序,可能比我們這里所做的要復(fù)雜。然而,大多數(shù)排序方式是以本節(jié)介紹的知識為基礎(chǔ)的
###倒著打印列表###
#要反轉(zhuǎn)列表元素的排列順序,使用方法reverse()
#假設(shè)汽車列表是按購買時間排列的,可輕松地按相反的順序排列其中的汽車
cars = ['bmw','audi','toyota','subaru']
print(cars)? ? ? ? ? ? ?#['bmw', 'audi', 'toyota', 'subaru']
cars.reverse()
print(cars) #['subaru', 'toyota', 'audi', 'bmw']
#####注意:reverse()方法,不是按與字母順序相反的順序排列列表元素,而只是反轉(zhuǎn)列表元素的排列順序#####
###方法reverse()也是永久性地修改列表元素的排列順序,但隨時可以恢復(fù)到原來的順序,只需再調(diào)用一次方法reverse()即可
##確定列表的長度##
#使用函數(shù)len()可快速獲悉列表的長度,
cars = ['bmw','audi','toyota','subaru','xiaoying']
print(len(cars))? #5
#函數(shù)len()很有用,如明確還有多少個外星人未被擊殺,明確需要管理多少項可視化數(shù)據(jù),計算網(wǎng)站有多少注冊用戶,等等...
###Python計算列表元素數(shù)時是從1開始的,因此確定列表長度時,你應(yīng)該不會遇到差一錯誤
###使用列表時避免索引錯誤###
#只有三個元素,你卻要訪問第4個元素,這將導(dǎo)致索引錯誤
motorcycles = ['honda','yamaha','suzuki']
# print(motorcycles[3])
'''
Traceback (most recent call last):
? File "D:\python\python_work\operating_elements_list.py", line 236, in <module>
? ? print(motorcycles[3])
IndexError: list index out of range
'''
#Python試圖向你提供位于索引3處的元素,但它搜索列表motorcycles時,卻發(fā)現(xiàn)索引為3處沒有元素。
#鑒于列表索引差一的特征,這種錯誤很常見。有些人從1開始數(shù),因此以為第三個元素的索引是3。然而在Python中
#第三個元素的索引是2,因為索引是從0開始的。
#索引錯誤就意味著Python在指定索引處找不到元素。程序發(fā)生索引錯誤時,請嘗試將指定的索引減1,然后再運行程序,看看結(jié)果是否正確
###別忘了,每當(dāng)需要訪問最后一個列表元素時,都可以使用索引-1,(多個元素中,當(dāng)然還可以使用索引-2,-3...)
###這在任何情況下都行之有效,即便你最后一次訪問列表后,其長度發(fā)生變化。索引-1總是返回最后一個列表元素
motorcycles = ['honda','yamaha','suzuki']
print(motorcycles[-1])? ?#suzuki
#僅當(dāng)列表為空時,這種索引-1訪問最后一個元素才會導(dǎo)致錯誤
motorcycles = []
#print(motorcycles[-1])
#列表motorcycles不包含任何元素,因此Python返回一條索引錯誤消息
'''
Traceback (most recent call last):
? File "D:\python\python_work\operating_elements_list.py", line 258, in <module>
? ? print(motorcycles[-1])
IndexError: list index out of range
'''
###注意:發(fā)生索引錯誤卻找不到方法時,請嘗試將列表或其長度打印出來。列表可能與你以為的截然不同,
###在程序?qū)ζ溥M(jìn)行了動態(tài)處理時尤為如此。通過查看列表或其包含的元素數(shù),可幫助你找出這種邏輯錯誤。