從刪除順序表中所有值爲X的元素說起,談談python中刪除list某個元素的方法

一個題目,長度爲n的順序表L中刪除所有值爲X的數據元素,要求時間複雜度爲O(n)O(n),空間複雜度爲O(1)O(1)

思路:用兩個數i,j,i表示當前數組中所在的位置,j用於遍歷數組,如果j的值不爲X,則加入到數組中,如果值爲X,則繼續遍歷,捨棄該數據。

下面是python代碼

def delX(a, x):
    i = 0
    j = 0
    while(i < len(a) and j < len(a)):
        if(a[j] != x):
            a[i] = a[j]
            i += 1

        j +=1

    print(id(a))
    #a = a[:i] #不能這麼計算了,a已經被修改,同時修改的是局部變量,不能通過參數返回
    del a[i:] #可以使用下面的del進行刪除
    print(id(a))
    

if __name__ == "__main__":
    a = [1, 2,3,5,2,6,3,6,78,9]
    print("org:",a, len(a), id(a))
    delX(a,2)
    print("del:",a, len(a), id(a))
    a = a[:7]
    print("test:", a, len(a), id(a))
    a.remove(1)
    print("remove:", a, len(a), id(a))
    a.pop(4)
    print("pop:", a, len(a), id(a))


運行上面的代碼,得到的輸出:

org: [1, 2, 3, 5, 2, 6, 3, 6, 78, 9] 10 4356218696
4356218696
4356218696
del: [1, 3, 5, 6, 3, 6, 78, 9] 8 4356218696
test: [1, 3, 5, 6, 3, 6, 78] 7 4356218760
remove: [3, 5, 6, 3, 6, 78] 6 4356218760
pop: [3, 5, 6, 3, 78] 5 4356218760

可以看到如果採用賦值的方式,上面list的地址空間將會改變。

所以刪除list中的元素不能使用賦值的方式,而是應該採用delremovepop這樣的方式。

delremovepop的區別是:

  • del 可以進行slice的操作,同時不會改變地址空間,比較方便
  • remove(X)將移除第一次出現X的值,注意:如果元素多次出現,只能移除第一次出現的元素,其他元素還在list中
  • pop(X) 將在list中移除list[X]的值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章