python刪除列表中特定元素的幾種方法
前言
題目如下:
給定一個僅包含大小寫字母和空格 ’ ’ 的字符串 s,返回其最後一個單詞的長度。如果字符串從左向右滾動顯示,那麼最後一個單詞就是最後出現的單詞。
如果不存在最後一個單詞,請返回 0 。
說明:一個單詞是指僅由字母組成、不包含任何空格字符的 最大子字符串。
示例:
輸入: "Hello World"
輸出: 5
思路
題目要求給一個字符串s,s僅包含字母和空格字符,要求返回最後一個單詞的長度,考慮如下幾點:
- 1、如果s是空字符,即s=“”,此時應該返回0;
- 2、如果s隻包含空格字符,即s=" ",此時也應該返回0;
- 3、如果s既包含字母也包含空格(或者隻包含字母),可以通過split()函數,用一個空格字符切割,這樣就可以得到一個列表,這個列表隻由連續的字母和空字符組成,然後把列表中的所有空字符刪除,最後把列表中的最後一項的長度返回即可;
所以現在的問題就轉化為:如何刪除一個列表中的特定元素,這裡的話,就是刪除列表中的空字符,即""
方法1
借助一個臨時列表,把非空元素提取到臨時列表中,然後取出臨時列表最後一項,返回其長度即可
這是最笨的方法,實際運行時也是最耗時的方法:
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(" ") # 通過split方法,用一個空格字符將字符串s進行切割,可以得到由單詞和空字符串組成的列表,將列表賦給temp new = [] # 定義一個空列表,作為中間變量 for t in temp: # 遍歷temp,把非空元素提取到new中,最後把new的最後一項的長度返回即可 if t != "": new.append(t) return len(new[-1])
在說方法2之前,說一個錯誤的方法:使用for循環,正向遍歷列表,刪除其中的空字符,
如下:
s = ["","","a", "a", "a","","",""] for i in range(0,len(s)): if s[i] == "": del s[i] print(s)
運行上述代碼,會報錯:
原因是當遇到空字符時,把空字符刪掉後,列表長度變小瞭,但是循環遍歷時,還是按照最初的長度遍歷,導致溢出;
另外這樣寫還存在一個弊端:可能會漏刪某些空字符,原因是當刪掉前面的空字符後,後面的元素依次向前移動,導致索引與原先對應的值發生變化,
如下:
b = ["","","a", "a", "a","","",""] for i in range(0,len(b)): if i >= len(b): # 加一個判斷,當i大於列表長度時,跳出循環,避免報錯 break if b[i] == "": del b[i] print(b)
所以我們在解決這個問題前,不能用for循環來正向遍歷列表
方法2:使用while循環
因為for循環無法達到目的,所以考慮使用while循環,如下:
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(" ") # 通過split方法,用一個空格字符將字符串s進行切割,可以得到由單詞和空字符串組成的列表,將列表賦給temp i = 0 # 設置初始指針,定為0 while i < len(temp): # 使用while循環,當指針i的值小於列表temp的長度時,則一直循環 if temp[i] == "": # 從索引0開始,如果temp[i]為空 del temp[i] # 則刪除該索引對應的值,也就是刪除temp[i] i -=1 # 刪除之後,由於列表整體長度變小瞭1位(也就是後面的元素都往前提瞭一位),所以索引i需要減1,以便下次遍歷時不丟掉挨著的元素 i += 1 # 判斷完索引i後,給索引自增1,進行下一輪判斷 return len(temp[-1]) # temp所有元素遍歷完成後,就剔除瞭所有空字符串,取出最後一項的長度返回即可
方法3:for循環倒序刪除空字符串
剛才說瞭使用for循環時,正向遍歷會導致溢出或者結果出錯,但是從後向前遍歷是可以的
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(" ") # 通過split方法,用一個空格字符將字符串s進行切割,可以得到由單詞和空字符串組成的列表,將列表賦給temp for i in range(len(temp)-1, -1, -1): # 倒序循環刪除空字符串 if temp[i] == "": del temp[i] return len(temp[-1])
方法4:拷貝原列表
拷貝原列表,然後遍歷拷貝的列表來找出空字符,最後再原列表中刪除空字符
''' 學習中遇到問題沒人解答?小編創建瞭一個Python學習交流QQ群:857662006 尋找有志同道合的小夥伴,互幫互助,群裡還有不錯的視頻學習教程和PDF電子書! ''' class Solution(object): def lengthOfLastWord_3(self, s): """ :type s: str :rtype: int """ if s.isspace(): # 判斷s是否隻由空格字符組成,如s==" ",用isspace()函數判斷 return 0 elif s == "": # 判斷s是否為空字符串,如s=="" return 0 else: # 如果s不為空,且不全是由空格組成 temp = s.split(" ") # 通過split方法,用一個空格字符將字符串s進行切割,可以得到由單詞和空字符串組成的列表,將列表賦給temp for i in temp[:]: # temp[:]是對原始的temp的一個拷貝,是一個新的list,所以,我們遍歷新的list,而刪除原始的list中的元素 if i == "": temp.remove(i) return len(temp[-1])
這樣理解一下:假如有一個列表s = [1,1,2,3,4,4,3,1],現在要把裡面的1都刪掉
我們先拷貝s,得到一個新列表(註意不能用一個變量直接等於s,如a=s,其實a和s都指向同一個列表,本質還是一個),新列表的元素與原列表完全相同
然後遍歷新列表,當遇到某個元素的值為1時,就在原列表中把這個元素刪掉(使用列表的remove方法刪除),因為remove在刪除元素時,隻會刪掉遇到的第一個目標元素,所以我們繼續遍歷新列表,如果再遇到1,就繼續在原列表中刪除,
最終遍歷完新列表,也就會在原列表中把所有1都刪掉瞭
上述代碼中的temp[:]是拷貝原列表得到新列表的一個方法,也可以通過如下方法復制得到一個新列表
>>> new_temp = temp[:] >>> new_temp = list(temp) >>> new_temp = temp*1 >>> import copy >>> new_temp = copy.copy(temp)
到此這篇關於python刪除列表中特定元素的幾種方法的文章就介紹到這瞭,更多相關python刪除列表元素內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python中的變量、運算符與流程控制
- Python入門教程之變量與數據類型
- python數組中的 k-diff 數對例題解析
- Python中五種實現字符串反轉的方法
- Python 一篇文章看懂Python集合與字典數據類型