python刪除列表中特定元素的幾種方法
前言
題目如下:
給定一個(gè)僅包含大小寫(xiě)字母和空格 ’ ’ 的字符串 s,返回其最后一個(gè)單詞的長(zhǎng)度。如果字符串從左向右滾動(dòng)顯示,那么最后一個(gè)單詞就是最后出現(xiàn)的單詞。
如果不存在最后一個(gè)單詞,請(qǐng)返回 0 。
說(shuō)明:一個(gè)單詞是指僅由字母組成、不包含任何空格字符的 最大子字符串。
示例:
輸入: "Hello World"
輸出: 5
思路
題目要求給一個(gè)字符串s,s僅包含字母和空格字符,要求返回最后一個(gè)單詞的長(zhǎng)度,考慮如下幾點(diǎn):
- 1、如果s是空字符,即s=“”,此時(shí)應(yīng)該返回0;
- 2、如果s只包含空格字符,即s=" ",此時(shí)也應(yīng)該返回0;
- 3、如果s既包含字母也包含空格(或者只包含字母),可以通過(guò)split()函數(shù),用一個(gè)空格字符切割,這樣就可以得到一個(gè)列表,這個(gè)列表只由連續(xù)的字母和空字符組成,然后把列表中的所有空字符刪除,最后把列表中的最后一項(xiàng)的長(zhǎng)度返回即可;
所以現(xiàn)在的問(wèn)題就轉(zhuǎn)化為:如何刪除一個(gè)列表中的特定元素,這里的話(huà),就是刪除列表中的空字符,即""
方法1
借助一個(gè)臨時(shí)列表,把非空元素提取到臨時(shí)列表中,然后取出臨時(shí)列表最后一項(xiàng),返回其長(zhǎng)度即可
這是最笨的方法,實(shí)際運(yùn)行時(shí)也是最耗時(shí)的方法:
class Solution(object):
def lengthOfLastWord(self, s):
"""
:type s: str
:rtype: int
"""
if s.isspace(): # 判斷s是否只由空格字符組成,如s==" "
return 0
elif s == "": # 判斷s是否為空字符串,如s==""
return 0
else: # 如果s不為空,且不全是由空格組成
temp = s.split(" ") # 通過(guò)split方法,用一個(gè)空格字符將字符串s進(jìn)行切割,可以得到由單詞和空字符串組成的列表,將列表賦給temp
new = [] # 定義一個(gè)空列表,作為中間變量
for t in temp: # 遍歷temp,把非空元素提取到new中,最后把new的最后一項(xiàng)的長(zhǎng)度返回即可
if t != "":
new.append(t)
return len(new[-1])在說(shuō)方法2之前,說(shuō)一個(gè)錯(cuò)誤的方法:使用for循環(huán),正向遍歷列表,刪除其中的空字符,
如下:
s = ["","","a", "a", "a","","",""] for i in range(0,len(s)): if s[i] == "": del s[i] print(s)
運(yùn)行上述代碼,會(huì)報(bào)錯(cuò):

原因是當(dāng)遇到空字符時(shí),把空字符刪掉后,列表長(zhǎng)度變小了,但是循環(huán)遍歷時(shí),還是按照最初的長(zhǎng)度遍歷,導(dǎo)致溢出;
另外這樣寫(xiě)還存在一個(gè)弊端:可能會(huì)漏刪某些空字符,原因是當(dāng)刪掉前面的空字符后,后面的元素依次向前移動(dòng),導(dǎo)致索引與原先對(duì)應(yīng)的值發(fā)生變化,
如下:
b = ["","","a", "a", "a","","",""] for i in range(0,len(b)): if i >= len(b): # 加一個(gè)判斷,當(dāng)i大于列表長(zhǎng)度時(shí),跳出循環(huán),避免報(bào)錯(cuò) break if b[i] == "": del b[i] print(b)

所以我們?cè)诮鉀Q這個(gè)問(wèn)題前,不能用for循環(huán)來(lái)正向遍歷列表
方法2:使用while循環(huán)
因?yàn)閒or循環(huán)無(wú)法達(dá)到目的,所以考慮使用while循環(huán),如下:
class Solution(object):
def lengthOfLastWord(self, s):
"""
:type s: str
:rtype: int
"""
if s.isspace(): # 判斷s是否只由空格字符組成,如s==" "
return 0
elif s == "": # 判斷s是否為空字符串,如s==""
return 0
else: # 如果s不為空,且不全是由空格組成
temp = s.split(" ") # 通過(guò)split方法,用一個(gè)空格字符將字符串s進(jìn)行切割,可以得到由單詞和空字符串組成的列表,將列表賦給temp
i = 0 # 設(shè)置初始指針,定為0
while i < len(temp): # 使用while循環(huán),當(dāng)指針i的值小于列表temp的長(zhǎng)度時(shí),則一直循環(huán)
if temp[i] == "": # 從索引0開(kāi)始,如果temp[i]為空
del temp[i] # 則刪除該索引對(duì)應(yīng)的值,也就是刪除temp[i]
i -=1 # 刪除之后,由于列表整體長(zhǎng)度變小了1位(也就是后面的元素都往前提了一位),所以索引i需要減1,以便下次遍歷時(shí)不丟掉挨著的元素
i += 1 # 判斷完索引i后,給索引自增1,進(jìn)行下一輪判斷
return len(temp[-1]) # temp所有元素遍歷完成后,就剔除了所有空字符串,取出最后一項(xiàng)的長(zhǎng)度返回即可方法3:for循環(huán)倒序刪除空字符串
剛才說(shuō)了使用for循環(huán)時(shí),正向遍歷會(huì)導(dǎo)致溢出或者結(jié)果出錯(cuò),但是從后向前遍歷是可以的
class Solution(object):
def lengthOfLastWord(self, s):
"""
倒序循環(huán)刪除空字符串
:type s: str
:rtype: int
"""
if s.isspace(): # 判斷s是否只由空格字符組成,如s==" "
return 0
elif s == "": # 判斷s是否為空字符串,如s==""
return 0
else: # 如果s不為空,且不全是由空格組成
temp = s.split(" ") # 通過(guò)split方法,用一個(gè)空格字符將字符串s進(jìn)行切割,可以得到由單詞和空字符串組成的列表,將列表賦給temp
for i in range(len(temp)-1, -1, -1): # 倒序循環(huán)刪除空字符串
if temp[i] == "":
del temp[i]
return len(temp[-1])方法4:拷貝原列表
拷貝原列表,然后遍歷拷貝的列表來(lái)找出空字符,最后再原列表中刪除空字符
class Solution(object):
def lengthOfLastWord_3(self, s):
"""
:type s: str
:rtype: int
"""
if s.isspace(): # 判斷s是否只由空格字符組成,如s==" ",用isspace()函數(shù)判斷
return 0
elif s == "": # 判斷s是否為空字符串,如s==""
return 0
else: # 如果s不為空,且不全是由空格組成
temp = s.split(" ") # 通過(guò)split方法,用一個(gè)空格字符將字符串s進(jìn)行切割,可以得到由單詞和空字符串組成的列表,將列表賦給temp
for i in temp[:]: # temp[:]是對(duì)原始的temp的一個(gè)拷貝,是一個(gè)新的list,所以,我們遍歷新的list,而刪除原始的list中的元素
if i == "":
temp.remove(i)
return len(temp[-1])這樣理解一下:假如有一個(gè)列表s = [1,1,2,3,4,4,3,1],現(xiàn)在要把里面的1都刪掉
我們先拷貝s,得到一個(gè)新列表(注意不能用一個(gè)變量直接等于s,如a=s,其實(shí)a和s都指向同一個(gè)列表,本質(zhì)還是一個(gè)),新列表的元素與原列表完全相同
然后遍歷新列表,當(dāng)遇到某個(gè)元素的值為1時(shí),就在原列表中把這個(gè)元素刪掉(使用列表的remove方法刪除),因?yàn)閞emove在刪除元素時(shí),只會(huì)刪掉遇到的第一個(gè)目標(biāo)元素,所以我們繼續(xù)遍歷新列表,如果再遇到1,就繼續(xù)在原列表中刪除,
最終遍歷完新列表,也就會(huì)在原列表中把所有1都刪掉了
上述代碼中的temp[:]是拷貝原列表得到新列表的一個(gè)方法,也可以通過(guò)如下方法復(fù)制得到一個(gè)新列表
>>> new_temp = temp[:] >>> new_temp = list(temp) >>> new_temp = temp*1 >>> import copy >>> new_temp = copy.copy(temp)
到此這篇關(guān)于python刪除列表中特定元素的幾種方法的文章就介紹到這了,更多相關(guān)python刪除列表元素內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python將人民幣轉(zhuǎn)換大寫(xiě)的腳本代碼
python將人民幣轉(zhuǎn)換大寫(xiě)的代碼,有需要的朋友可以參考下2013-02-02
python線(xiàn)程定時(shí)器Timer實(shí)現(xiàn)原理解析
這篇文章主要介紹了python線(xiàn)程定時(shí)器Timer實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
python3使用print打印帶顏色的字符串代碼實(shí)例
這篇文章主要介紹了python3使用print打印帶顏色的字符串代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python讀取英文文件并記錄每個(gè)單詞出現(xiàn)次數(shù)后降序輸出示例
這篇文章主要介紹了Python讀取英文文件并記錄每個(gè)單詞出現(xiàn)次數(shù)后降序輸出,涉及Python文件讀取、字符串替換、分割以及字典遍歷、排序等相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
python模擬嗶哩嗶哩滑塊登入驗(yàn)證的實(shí)現(xiàn)
這篇文章主要介紹了python模擬嗶哩嗶哩滑塊登入驗(yàn)證的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
通過(guò)python調(diào)用adb命令對(duì)App進(jìn)行性能測(cè)試方式
這篇文章主要介紹了通過(guò)python調(diào)用adb命令對(duì)App進(jìn)行性能測(cè)試方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Python 經(jīng)典算法100及解析(小結(jié))
這篇文章主要介紹了Python 經(jīng)典算法100及解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
python飛機(jī)大戰(zhàn)游戲?qū)嵗v解
在本篇文章里小編給大家整理的是一篇關(guān)于python飛機(jī)大戰(zhàn)游戲?qū)嵗v解,有興趣的朋友們可以參考下。2020-12-12

