Python實現列表索引批量刪除的5種方法
最近用Java做專案,使用到List broadcastInfos的 broadcastInfos.remove()方法,出現專案的重大失誤,因為第一次使用Java語言,過於相信remove()方法,所以,不加思索的就使用了來刪除list物件中的指定元素。
背景:
目標物件 listObj:[3,4,5,6]
刪除指定索引列表 indexList: [1,2]
返回結果: [3,6]
常見錯誤:
for listElement in listObj: for index in indexList: if listElement == listObj[index]: listObj.remove(listElement)
返回結果
這種結果,既不會報錯,返回值也與目標極為相似,返回2個值list物件,len(listObj)-2 = 2,也是[3,… 開頭,如果不仔細看好像沒什麼問題。但是結果卻是錯誤的。
將 listObj.remove()
改為listObj.pop(index)
結果也是相同的。
Java用同樣的程式設計思想,得到的結果也有相似性。
這種錯誤,主要是初學者對於資料儲存原理沒有理解清楚,或者,沒有意識到記憶體儲存長度的動態變化導致的, 下面介紹幾種Python刪除指定列表索引的方法
a = [3,6] b = [1,2] # b 中為 a的索引 # 刪除a中下標為b中的元素 # ====> [3,6] # 方法一 a = [a[i] for i in range(len(a)) if (i not in b)] print(a) # 重新生成滿足條件的list並賦值給 a # 方法二 [ a.remove(cElement) for cElement in [a[i] for i in b]] print(a) # 強制使用 a.remove() 方法方式 # 方法三 a = {a[i] if i not in b else None for i in range(len(a))} a.remove(None) # 將要刪除的物件設定為預設值, # 前提是返回結果無序要求以及 純一種型別 print(a) # 方法四 m = {i:element for i,element in enumerate(a)} [m.pop(i) for i in b] print(list(m.values())) # 將每一個元素物件編碼,然後按指定的索引刪除, # 並返回 values() 集合物件 --> list物件 # 方法五 class ListSub: def __init__(self,list1=None): if list1 is None: self.listA = [] elif len(list1): self.listA = [x for x in list1] def __sub__(self,rhs): [self.listA.remove(cElement) for cElement in [self.listA[i] for i in rhs.listA]] return self.listA a = ListSub(a) b = ListSub(b) print(a-b) # 自己寫個類,既然Python 不支援 “-” 這個符號, # 而喜歡儲存索引的同學,自己寫個工具類,實現減法, # 返回自己想要的結果物件。
當然,以上的方式都只是純粹將方法的實現,沒有進行演算法優化,以及相應的異常捕獲和處理,而Python的效率是有名的…,所有大牛們請不要過多介懷。
方法其實還有很多,但就專案中出現的Java語法這種錯誤, 我就用Python 來反省一下自己,希望能幫到大家,謝謝。
最後,在學習其他語言的同時,才知道,Python有他語言的便捷之處,也有其他語言共有的缺憾,沒有語言基礎的使用者,坑尤其多(比如List類的使用),所以,還要廣學習,多對比,寫出集多種語言精華的程式碼,然更多初學者將精力放在業務處理和程式的實現上。
到此這篇關於Python實現列表索引批量刪除的5種方法的文章就介紹到這了,更多相關Python 列表索引批量內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!