第四章4:使用列表
第四章4:使用列表
現(xiàn)在我們已經(jīng)學(xué)習(xí)了什么是列表和如何使用循環(huán),我們今天將學(xué)習(xí)如何使用列表。在Python中,列表對(duì)于任何程序都非常重要,所以,我們需要理解我們什么時(shí)候使用它們。
檢查長(zhǎng)度
通常我們將需要知道一個(gè)列表中包含多少個(gè)對(duì)象。為了實(shí)現(xiàn)這個(gè)目標(biāo),我們使用len()函數(shù):
# 檢查列表中對(duì)象的數(shù)量
nums = [5, 10, 15]
length = len(nums) # len()返加一個(gè)整數(shù)
print(length)
繼續(xù)并運(yùn)行這一代碼塊。這個(gè)代碼塊將輸出整數(shù)3。我們后面將多次使用length函數(shù),無(wú)論是檢查一個(gè)空列表還是在range函數(shù)中使用它來(lái)角確定一個(gè)循環(huán)的次數(shù)。
列表切片
回顧前幾周,我們討論了一個(gè)字符的切片。列表切片也是同樣的方式,以便于我們能夠獲得特定的對(duì)象。切片和range()函數(shù)具有一樣的參數(shù),如開(kāi)始、結(jié)束、步長(zhǎng):
# 用切片獲取一個(gè)列表中的特定對(duì)象
print(nums[1:3]) # 輸出結(jié)果為索引位置1和2上的對(duì)象
print(nums[:2]) # 輸出結(jié)果為索引位置0和1上的對(duì)象
print(nums[::2]) # 輸出結(jié)果為索引位置0,2和4上的對(duì)象,即索引從數(shù)字0開(kāi)始,每次遞增2
print(nums[-2:]) # 輸出結(jié)果為列表中最后兩個(gè)的對(duì)象
繼續(xù)并運(yùn)行這一代碼塊。輸出結(jié)果顯示在每個(gè)語(yǔ)句后邊的注釋中。我們使用方括號(hào)表示法,正如我們?cè)L問(wèn)索引一樣,只是我們通過(guò)冒號(hào)分開(kāi)其他值,而順序剛保持為[開(kāi)始:停止:步長(zhǎng)]。方括號(hào)表示法默認(rèn)從0開(kāi)始,步長(zhǎng)為1。如果你想使用默認(rèn)值,可以選擇不使用這些值。對(duì)于步長(zhǎng)為正而開(kāi)始值為負(fù)將會(huì)使切片從后向前獲取數(shù)據(jù)。如果從開(kāi)始位置或停止的位置使用負(fù)數(shù),則切片將從后面開(kāi)始或停止。這意味著,如果你將停止位置上為-5,切片獲取的對(duì)象將從列表的開(kāi)頭一直切到列表結(jié)束之前的五個(gè)元素。
增加元素
當(dāng)你需要向你的現(xiàn)有列表中添元素,Python有兩個(gè)不同的方法來(lái)實(shí)現(xiàn)這一目標(biāo)。
.append()
Append方法總是將值添加到列表內(nèi)元素的后面。讓我們來(lái)看一下:
# 使用append方法將增加一個(gè)元素到列表內(nèi)元素的后面
nums = [10, 20]
print(nums) # 輸出[10, 20]
nums.append(5)
print(nums) # 輸出[10, 20, 5]
繼續(xù)并運(yùn)行這一代碼塊。我們創(chuàng)建了一個(gè)包含兩個(gè)元素的列表,然后將數(shù)值5添加到列表的后面。
.insert()
增加一個(gè)元素到列表中的第二個(gè)方法是使用insert函數(shù)。這一方法需要一個(gè)索引值才能將增加的值插入到指定位置。讓我們來(lái)看一個(gè)例子:
# 在列表最開(kāi)始的位置增加一個(gè)數(shù)值
words = ['ball', 'base']
print(words) # 輸出結(jié)果為['ball', 'base']
words.insert(0, 'golve') # 第一個(gè)參數(shù)是索引,第二個(gè)是數(shù)值
print(words) # 輸出結(jié)果為['golve', 'ball', 'base']
繼續(xù)并運(yùn)行這一代碼塊。輸出結(jié)果為['glove','ball','base']。glove現(xiàn)在在零索引位置上,因?yàn)槲覀冊(cè)趇nsert方法中指定了在該索引位置上插入數(shù)值。
移除元素
從一個(gè)列表中移除元素有多種方式,接下來(lái)我主要介紹其中的兩種方法。
.pop()
默認(rèn)情況下,pop方法會(huì)移除列表中最后一個(gè)元素,當(dāng)然,你也可以指定索引去移除元素。這種方法也被廣泛的用來(lái)存儲(chǔ)被移除的元素。當(dāng)使用pop方法時(shí),它不僅稱除了相應(yīng)的元素,而且還會(huì)返回這個(gè)元素。這就可以讓我們使用一個(gè)變量來(lái)存儲(chǔ)從列表中移除的那個(gè)元素,以便之后使用:
# 使用pop方法移除元素并將其存儲(chǔ)到一個(gè)變量中以便之后使用
items = [5, 'ball', True]
items.pop() # 默認(rèn)移除列表中最后一個(gè)元素
removed_item = items.pop(0) # 移除元素5并存儲(chǔ)進(jìn)removed_item變量中
print(removed_item, '\n', items)
繼續(xù)并運(yùn)行這一代碼塊。使用pop方法,我們可以看到它首先移除了列表中最后一個(gè)元素True,那么,接著移除了索引位置0上的元素5。當(dāng)整數(shù)5移除列表時(shí),我們同時(shí)將其保存到一個(gè)新變量中,然后將其與新列表一起輸出。
.remove()
remove方法允許我們基于給定的元素來(lái)從列表中移除相應(yīng)的元素:
# 用一個(gè)try和except來(lái)使用remove方法
sports = ['bseball', 'soccer', 'football', 'hockey']
try:
sports.remove('soccer')
except:
print('That item does not exist in the list')
print(sports)
繼續(xù)并運(yùn)行這一代碼塊。在這里,我們將看到結(jié)果輸出的是沒(méi)有元素soccer的列表,這是因?yàn)樵豷occer剛剛已經(jīng)被我們刪除了。另外要說(shuō)明的一點(diǎn)是,我們之所以嘗試使用try和except結(jié)構(gòu)語(yǔ)句,是因?yàn)槿绻斜碇胁淮嬖谠亍皊occer”,則可以防止該程序崩潰。
使用數(shù)值列表數(shù)據(jù)
對(duì)于我們使用的數(shù)值型數(shù)據(jù),Python為我們提供了一些函數(shù)來(lái)了解數(shù)值型數(shù)據(jù)的特征,如min(求最小值)、 max(求最大值)和sum(求和)。盡管這些是最常用的一些函數(shù),但是我們?nèi)匀挥懈嗟暮瘮?shù)可使用:
# 使用min,max和sum
nums = [5, 3, 9]
print(min(nums)) # 輸出列表中最小值
print(max(nums)) # 輸出列表中最大值
print(sum(nums)) # 輸出列表中所有數(shù)值的和
繼續(xù)并運(yùn)行這一代碼塊。輸出結(jié)果將為3、9和17。正如其名稱所述,他們將找到列表中的最小值和最大值。sum函數(shù)則將簡(jiǎn)單地將列表中所有數(shù)字加總求和。
列表排序
在實(shí)際應(yīng)用中,你經(jīng)常會(huì)使用一個(gè)有序的列表。在Python中有兩種方法可以實(shí)現(xiàn)這一目標(biāo),但這兩種方法又存在一定差異。一個(gè)會(huì)直接覆蓋原始列表,另一個(gè)則會(huì)返回一個(gè)新創(chuàng)建的列表。
sorted()
sorted函數(shù)無(wú)論對(duì)數(shù)值型列表還是字符型列表都是有效的,但對(duì)于二者混合的列表則是無(wú)效的。sorted函數(shù)結(jié)果會(huì)返回一個(gè)列表的副本,所以它不會(huì)改變?cè)剂斜?。通常?lái)說(shuō),如果你需要保留原始且完整的列表,則使用這一函數(shù):
# 對(duì)于數(shù)值型列表和字符型列表使用sorted方法排序
nums = [5, 8, 0, 2]
sorted_nums = sorted(nums) # 使用sorted方法排序后存儲(chǔ)在一個(gè)新變量中
print(nums, sorted_nums) # 輸出原始的列表和排序后的列表
繼續(xù)并運(yùn)行這一代碼塊。你會(huì)注意到,在聲明nums列表時(shí),其輸出結(jié)果仍是保持原始順序的列表。要獲取新的排序后列表,我們只需將其保存到一個(gè)新變量中即可。
.sort()
sort方法的使用目的與我們上面所講的sorted函數(shù)目的相同;但是,不同的是它會(huì)直接更改并覆蓋原始列表:
# 使用.sort()函數(shù)對(duì)列表進(jìn)行排序
nums = [5, 0, 8, 3]
nums.sort() # 真接更改并覆蓋原始列表
print(nums)
繼續(xù)并運(yùn)行這一代碼塊。結(jié)果輸出將是一個(gè)正確排序后的列表。只需記住,nums變量現(xiàn)在已更改,因?yàn)?sort()函數(shù)直接更改了變量的值。
條件和列表
在實(shí)際使用列表時(shí),我們通常需要檢查列表中的某一元素量否存在。現(xiàn)在我將介紹如何在一個(gè)列表中運(yùn)行條件語(yǔ)句。將列表和條件語(yǔ)句相結(jié)合的原因有很多。以下幾個(gè)例子只是其中的幾種原因。
使用“in”和“not in”關(guān)鍵詞
上周介紹條件語(yǔ)句時(shí),我們已經(jīng)看到了這些關(guān)鍵字的使用。使用列表時(shí),它們的目的是在列表中快速查找對(duì)應(yīng)的值:
# 在一個(gè)列表中使用條件語(yǔ)句
names = ['Jack', 'Robert', 'Mary']
if 'Mary' in names:
print('found') # 當(dāng)Mary在列表中將會(huì)運(yùn)行這一代碼
if 'Jimmy' not in names:
print('not found') # 當(dāng)Jimmy不在列表中將會(huì)運(yùn)行這一代碼
繼續(xù)并運(yùn)行這一代碼塊。輸出結(jié)果為“found”和“not found”。在第一個(gè)語(yǔ)句中,我們?cè)噲D查看列表中是否存在“Mary”,結(jié)果確實(shí)存在。第二個(gè)條件語(yǔ)句檢查“ Jimmy”是否不存于列表中,這也是正確的,因此它也可以運(yùn)行。
檢查一個(gè)空列表
對(duì)于空列表的檢查有很多原因,提及最多的就是確保在你的程序中不會(huì)引發(fā)任何錯(cuò)誤,接下來(lái),讓我們來(lái)看如何對(duì)空列表進(jìn)行檢查:
# 使用條件語(yǔ)名來(lái)查看列表是否為空
nums = []
if not nums: # 等價(jià)于語(yǔ)法:if nums = []
print('empty')
繼續(xù)并運(yùn)行這一代碼塊。這將會(huì)輸出“empty”。它在注釋我們已經(jīng)提到,但我們也可以檢查一下是否等于空括號(hào)。在這里,我想向你展示如何使用“ not”關(guān)鍵字。為了檢查列表的元素,你將寫(xiě)下這樣代碼:
if nums
循環(huán)和列表
你能使用for循環(huán)和while循環(huán)去迭代列表中的元素。
使用for循環(huán)
當(dāng)使用for循環(huán)迭代列表中的元素時(shí),語(yǔ)法上看起來(lái)像之前我們使用的range()函數(shù)。然而,這次我們使用一個(gè)暫時(shí)變量,關(guān)鍵詞in和列表名稱。對(duì)于每一次迭代,這個(gè)臨時(shí)變量都會(huì)被分配一個(gè)新的元素的值。讓我們來(lái)試試看。
# 使用for循環(huán)列印列表中的所有元素
sports = ['Baseball', 'Hockey', 'Football', 'Basketball']
for sport in sports:
print(sport)
繼續(xù)并運(yùn)行這一代碼塊。在這里,我們可以看到這一代碼塊將輸出列表中的每個(gè)元素。在第一次迭代期間,臨時(shí)變量“ sport”被分配為“ Baseball”,一旦將其打印出來(lái),它將移至下一個(gè)列表中的元素。
使用while循環(huán)
while循環(huán)通常用于條件循環(huán)。while循環(huán)一個(gè)比較典型的用法就是移除列表中的元素。while循環(huán)還有很多用法,這僅僅是眾多用法中的一種:
# 使用while循環(huán)移除一個(gè)特定值
names = ['Bob', 'Jack', 'Rob', 'Bob', 'Robert']
while 'Bob' in names:
names.remove('Bob') # 移除列表中的所有的Bob字符
print(names)
繼續(xù)并運(yùn)行這一代碼塊。變量names輸出結(jié)果將是沒(méi)有字符“ Bob”的列表。我們將while循環(huán)與條件語(yǔ)句結(jié)合使用,當(dāng)檢查到列表中的“ Bob”值后,然后刪除它,直到條件不再成立為止。
星期四練習(xí)
1.移除重復(fù)值:從下面的列表中移除全部重復(fù)值,輸出結(jié)果應(yīng)是[‘Bob’, ‘Kenny’, ‘Amanda’]
小提示:使用.count()方法并結(jié)合while循環(huán)。
2.用戶輸入:使用一個(gè)while循環(huán)來(lái)持持續(xù)要求用戶輸入一個(gè)詞語(yǔ),直到用戶輸入“quit”。一旦用戶輸入一個(gè)詞,就將這個(gè)詞添加到列表中。一旦他們中止循環(huán),則用for循環(huán)輸出列表中的所有元素。
今天講解的知識(shí)點(diǎn)很重要,通過(guò)上述講解的內(nèi)容我們才能了解如何使用列表,是否它可以是條件語(yǔ)句或循環(huán)。列表可以結(jié)合很多方法使用; 在本書(shū)的其余部分中,我們將更詳細(xì)的介紹它們。
