最近用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, 4, 5, 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 清單索引批量内容請搜尋以前的文章或繼續浏覽下面的相關文章希望大家以後多多支援!