Python實(shí)現(xiàn)列表索引批量刪除的5種方法
最近用Java做項(xiàng)目,使用到List broadcastInfos的 broadcastInfos.remove()方法,出現(xiàn)項(xiàng)目的重大失誤,因?yàn)榈谝淮问褂肑ava語(yǔ)言,過(guò)于相信remove()方法,所以,不加思索的就使用了來(lái)刪除list對(duì)象中的指定元素。
背景:目標(biāo)對(duì)象 listObj:[3, 4, 5, 6]刪除指定索引列表 indexList: [1, 2]返回結(jié)果: [3, 6]常見(jiàn)錯(cuò)誤:
for listElement in listObj:for index in indexList:if listElement == listObj[index]:listObj.remove(listElement)
返回結(jié)果
這種結(jié)果,既不會(huì)報(bào)錯(cuò),返回值也與目標(biāo)極為相似,返回2個(gè)值list對(duì)象,len(listObj)-2 = 2,也是[3,… 開(kāi)頭,如果不仔細(xì)看好像沒(méi)什么問(wèn)題。但是結(jié)果卻是錯(cuò)誤的。
將 listObj.remove() 改為listObj.pop(index)結(jié)果也是相同的。
Java用同樣的編程思想,得到的結(jié)果也有相似性。這種錯(cuò)誤,主要是初學(xué)者對(duì)于數(shù)據(jù)存儲(chǔ)原理沒(méi)有理解清楚,或者,沒(méi)有意識(shí)到內(nèi)存存儲(chǔ)長(zhǎng)度的動(dòng)態(tài)變化導(dǎo)致的, 下面介紹幾種Python刪除指定列表索引的方法
a = [3, 4, 5, 6]b = [1,2] # b 中為 a的索引# 刪除a中下標(biāo)為b中的元素# ====> [3, 6]# 方法一a = [a[i] for i in range(len(a)) if (i not in b)]print(a) # 重新生成滿(mǎn)足條件的list并賦值給 a # 方法二[ a.remove(cElement) for cElement in [a[i] for i in b]]print(a) # 強(qiáng)制使用 a.remove() 方法方式# 方法三a = {a[i] if i not in b else None for i in range(len(a))}a.remove(None) # 將要?jiǎng)h除的對(duì)象設(shè)置為默認(rèn)值,# 前提是返回結(jié)果無(wú)序要求以及 純一種類(lèi)型print(a)# 方法四m = {i:element for i, element in enumerate(a)}[m.pop(i) for i in b]print(list(m.values())) # 將每一個(gè)元素對(duì)象編碼,然后按指定的索引刪除, # 并返回 values() 集合對(duì)象 --> list對(duì)象# 方法五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.listAa = ListSub(a)b = ListSub(b)print(a-b) # 自己寫(xiě)個(gè)類(lèi),既然Python 不支持 “-” 這個(gè)符號(hào), # 而喜歡存儲(chǔ)索引的同學(xué),自己寫(xiě)個(gè)工具類(lèi),實(shí)現(xiàn)減法, # 返回自己想要的結(jié)果對(duì)象。
當(dāng)然,以上的方式都只是純粹將方法的實(shí)現(xiàn),沒(méi)有進(jìn)行算法優(yōu)化,以及相應(yīng)的異常捕獲和處理,而Python的效率是有名的…, 所有大牛們請(qǐng)不要過(guò)多介懷。
方法其實(shí)還有很多,但就項(xiàng)目中出現(xiàn)的Java語(yǔ)法這種錯(cuò)誤, 我就用Python 來(lái)反省一下自己,希望能幫到大家,謝謝。
最后,在學(xué)習(xí)其他語(yǔ)言的同時(shí),才知道,Python有他語(yǔ)言的便捷之處,也有其他語(yǔ)言共有的缺憾,沒(méi)有語(yǔ)言基礎(chǔ)的使用者,坑尤其多(比如List類(lèi)的使用),所以,還要廣學(xué)習(xí),多對(duì)比,寫(xiě)出集多種語(yǔ)言精華的代碼,然更多初學(xué)者將精力放在業(yè)務(wù)處理和程序的實(shí)現(xiàn)上。
到此這篇關(guān)于Python實(shí)現(xiàn)列表索引批量刪除的5種方法的文章就介紹到這了,更多相關(guān)Python 列表索引批量?jī)?nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. JSP動(dòng)態(tài)網(wǎng)頁(yè)開(kāi)發(fā)原理詳解2. XHTML 1.0:標(biāo)記新的開(kāi)端3. Vue中使用Echarts儀表盤(pán)展示實(shí)時(shí)數(shù)據(jù)的實(shí)現(xiàn)4. PHP擴(kuò)展之URL編碼、解碼及解析——URLs5. python如何使用騰訊云發(fā)送短信6. python基于win32實(shí)現(xiàn)窗口截圖7. .NET6使用ImageSharp實(shí)現(xiàn)給圖片添加水印8. WML學(xué)習(xí)之六 事件9. 詳解Java關(guān)于時(shí)間格式化的方法10. vue實(shí)現(xiàn)動(dòng)態(tài)給id賦值,點(diǎn)擊事件獲取當(dāng)前點(diǎn)擊的元素的id操作
